2016-08-31 3 views
0

変数が定義する順序を変更すると、プログラムがクラッシュする。 私は期待どおり、このためには、それが実行されます:異なる順序で変数を定義するとクラッシュする

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; 
}; 

を、私は、変数「名」と「状態」の定義順序を変更した場合、それがクラッシュします:

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]; 
}; 

ここでGDBがありますスタック、それは私がスレッドを開始する前に、各thread.Itが定義されているlableに使用する変数がある

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 

「名前」奇妙に見える、それは時にスレッド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

デバッガ、gdb、または小さな動作例の出力を投稿することはできますか? – Roby

+0

これは 'xThread()'がどのように定義されているかに依存します。初期化おそらく 'name []'はその前に宣言されている変数によって使用されています。コンストラクタの定義を投稿します。 – iammilind

+0

xThread.cppのソースコードを所有していて、それをプロジェクトでコンパイルしていますか?または、ライブラリを使用していますか?投稿されたスニペット(変更しようとしているもの)は、ライブラリと一緒に配布されているヘッダーのコピーですか? –

答えて

-1

あなただけではない順序を変更しました。名前はプライベートになりました。私はこのクラスで "名前"の使用を見ることができません。それは少なくとも保護されるべきですか?

+0

これを変更することはクラッシュの原因になります。 – molbdnilo

+0

ok。小さな情報を提供しました –

+0

SceneServer.cppという行は何ですか:152 スレッド名を印刷しますか? –

-1

まず、オブジェクト指向のプログラマとして、変数は「プライベート」に定義する必要があることを知っておく必要があります。

問題は、その変数の状態(プライベート、保護またはパブリック)によって発生する可能性があります。私が見ている限り、 "name"配列を使用するコード部分は見えませんので、正確な答えはありません。まず、この変数を "private"と宣言し、この変数を取得するメソッド(getter)を作成する必要があります。その後、そのゲッターで使用します。より良いアプローチになります。

よろしくお願いします。

+0

「C++プログラミングでの優れた実践」についての議論では、 。あなたは反...ええ...狩りですか? –

関連する問題