如果我改变了变量定义的顺序,我的程序就会崩溃,有人知道为什么吗?按照这个顺序,它将按照我预期的那样运行:
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”的定义顺序,它将崩溃:
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堆栈,看起来很奇怪。
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:
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;
}发布于 2016-08-31 15:23:52
你不仅改变了秩序。名字变成了私人的。我在这个类中看不到"name“的任何用法。它至少应该受到保护吗?
https://stackoverflow.com/questions/39243126
复制相似问题