2016-08-31 2 views
0

Mein Programm stürzt ab, wenn ich die Reihenfolge der Variablen ändere, weiß jemand warum? In dieser Reihenfolge wird es laufen, wie ich erwarten:Variablen in verschiedenen Ordnungen definieren Absturz verursachen

class xThread 
{ 
public: 
    xThread(); 
    virtual ~xThread() {} 

    bool thread_start(); 
    virtual bool thread_init(){return true;} 
    virtual void thread_stop(); 

    void thread_setState(ThreadState s) {state = s;} 
    ThreadState thread_getState(){return state;} 

    static void *thread_run(void *param); 
    void setName(const char *n); 
    char name[MAX_NAMESIZE]; 

protected: 
    volatile ThreadState state; 
    virtual void thread_proc()=0; 

private: 
    pthread_t pid; 
}; 

Wenn ich die definieren Reihenfolge der Variablen „Name“ und „Zustand“ zu ändern, wird es abstürzen:

class xThread 
{ 
public: 
    xThread(); 
    virtual ~xThread() {} 

    bool thread_start(); 
    virtual bool thread_init(){return true;} 
    virtual void thread_stop(); 

    void thread_setState(ThreadState s) {state = s;} 
    ThreadState thread_getState(){return state;} 

    static void *thread_run(void *param); 
    void setName(const char *n); 

protected: 
    volatile ThreadState state; 
    virtual void thread_proc()=0; 

private: 
    pthread_t pid; 
    char name[MAX_NAMESIZE]; 
}; 

Hier ist der GDB Stapel, sieht es seltsam

0 0x00007f34dfaeff72 in _int_malloc() from /lib64/libc.so.6 
1 0x00007f34dfaf187c in malloc() from /lib64/libc.so.6 
2 0x00007f34e03aa0cd in operator new(unsigned long)() from /lib64/libstdc++.so.6 
3 0x00007f34e15d93b1 in log4cxx::Logger::forcedLog(log4cxx::helpers::ObjectPtrT<log4cxx::Level> const&, std::string const&, log4cxx::spi::LocationInfo const&) const() from /lib64/liblog4cxx.so.10 
4 0x000000000081e615 in xServer::v_final (this=0x19921b0) at xlib/xServer.cpp:112 
5 0x000000000082218c in xServer::run (this=0x19921b0) at xlib/xServer.cpp:411 
6 0x00000000007b2ebc in main (argc=4, argv=0x7fff46d5f258) at SceneServer.cpp:152 

„name“ eine Variable I eingesetzt, um jede thread.It lable definiert wird, bevor der Thread gestartet, und es wird gedruckt, wenn der Faden terminateed.

main.cpp:

HttpClientThread client; 
    client.setName("HttpClientThread "); 
    client.thread_start(); 

xThread.cpp:

xThread::xThread() 
{ 
    thread_setState(THREAD_INIT); 
    bzero(name, sizeof(name)); 
    pid = 0; 
} 

xThread::~xThread() 
{ 
    LOG4CXX_DEBUG(::log4cxx::Logger::getLogger("main"), name); 
} 

void xThread::setName(const char *n) 
{ 
    if (!n) return; 
    bzero(name, sizeof(name)); 
    strncpy(name, n, MAX_NAMESIZE-1); 
} 

bool xThread::thread_start() 
{ 
    if (!thread_init()) return false; 

    int ret = pthread_create(&pid, NULL, &thread_run, (void *)this); 
    if (ret == 0) 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

void xThread::thread_stop() 
{ 
    if (thread_getState()==THREAD_INIT) 
     thread_setState(THREAD_FINISH); 

    if (thread_getState()==THREAD_RUN) 
     thread_setState(THREAD_STOP); 
} 

void *xThread::thread_run(void *param) 
{ 
    xThread *t = (xThread *)param; 
    t->thread_proc(); 
    t->thread_setState(THREAD_FINISH); 
    return 0; 
} 
+0

könnten Sie die Ausgabe des Debuggers, gdb und oder kleines Arbeitsbeispiel veröffentlichen? – Roby

+0

Dies hängt davon ab, wie 'xThread()' definiert ist w.r.t. die Initialisierung. Möglicherweise wird 'name []' dort von einer Variablen verwendet, die davor deklariert ist. Veröffentlichen Sie die Definition von Konstruktoren. – iammilind

+0

Besitzen Sie den Quellcode für xThread.cpp und kompilieren Sie ihn in Ihrem Projekt? Oder verwenden Sie nur eine Bibliothek und das veröffentlichte Snippet (das, das Sie zu ändern versuchen) ist eine Kopie von einem Header mit der Bibliothek verteilt? –

Antwort

-1

Sie haben nicht nur geändert, um. Name wurde privat. Ich kann keine Verwendung von "Name" in dieser Klasse sehen. Sollte es zumindest geschützt sein?

+0

Es gibt keine Möglichkeit, dass das Ändern einen Absturz verursacht. – molbdnilo

+0

ok. aber Sie haben ein kleines Stück Info zur Verfügung gestellt –

+0

Was ist die Zeile SceneServer.cpp: 152 Drucken Thread-Namen? –

-1

Zunächst einmal sollten Sie als objektorientierter Programmierer wissen, dass Variablen als "privat" definiert werden müssen.

Das Problem, das Sie haben, kann durch den Status dieser Variablen (privat, geschützt oder öffentlich) verursacht werden. Soweit ich sehe, können wir nicht den Code Stück sehen, wo Sie "Name" -Array verwenden, so wird es keine genaue Antwort geben. Zuerst sollten Sie diese Variable als "privat" deklarieren und eine Methode erstellen, um diese Variable zu erhalten (ein Getter). Dann benutze es mit diesem Getter. Es wird ein besserer Ansatz sein.

Mit freundlichen Grüßen, Nein.

+0

Das Besprechen einer Frage der 'guten Praxis in der C++ Programmierung' wird das Problem nicht lösen . Bist du rep ... ähem ... jagen? –

Verwandte Themen