首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以不同的顺序定义变量会导致崩溃

以不同的顺序定义变量会导致崩溃
EN

Stack Overflow用户
提问于 2016-08-31 15:18:40
回答 1查看 122关注 0票数 0

如果我改变了变量定义的顺序,我的程序就会崩溃,有人知道为什么吗?按照这个顺序,它将按照我预期的那样运行:

代码语言:javascript
复制
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;
};

如果我更改变量"name“和"state”的定义顺序,它将崩溃:

代码语言:javascript
复制
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堆栈,看起来很奇怪。

代码语言:javascript
复制
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

“thread.It”是我用来标记每个名称的变量,每个名称都是在线程启动之前定义的,它在线程终止时打印出来。

main.cpp:

代码语言:javascript
复制
    HttpClientThread client;
    client.setName("HttpClientThread ");
    client.thread_start();

xThread.cpp:

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

发布于 2016-08-31 15:23:52

你不仅改变了秩序。名字变成了私人的。我在这个类中看不到"name“的任何用法。它至少应该受到保护吗?

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39243126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档