IDO*_*IDO 2 c++ destructor pthreads segment
我在调用函数unit_thread_data\xef\xbc\x8c时出现段错误,实际上它是由~Data()引起的。thread1没问题,但是thread2导致了段错误,整个代码如下:(请原谅糟糕的代码风格),错误信息是双重释放或损坏。其他信息:gcc5.4.0、centos7。有什么帮助吗?非常感谢!
\n#include <iostream>\n#include <pthread.h>\n#include <unistd.h>\nusing namespace std;\nclass Data\n{\npublic:\n int* A_;\n Data()\n {\n cout<<"111\\n";\n A_=NULL;\n }\n ~Data()\n {\n cout<<"222\\n";\n if(A_) {\n delete A_;\n }\n }\n};\n\nstruct thread_data_t\n{\n Data* d;\n};\n\nvoid* _add(void* _pthread_data)\n{\n thread_data_t* pthread_data = (thread_data_t*) _pthread_data;\n pthread_data->d->A_ = new int[2];\n pthread_data->d->A_[0] = 1;\n pthread_data->d->A_[1] = 2;\n std::cout<<pthread_data->d->A_[0]+pthread_data->d->A_[1]<<endl;\n return (void*)0;\n}\n\nvoid unit_thread_data(thread_data_t* pthread_data)\n{\n for(int i=0;i<2;i++)\n {\n delete[] pthread_data[i].d->A_;\n delete pthread_data[i].d;\n }\n delete[] pthread_data;\n}\nint main()\n{\n int num_threads = 2;\n pthread_t threads[num_threads];\n thread_data_t* pthread_data = new thread_data_t[num_threads];\n for(int i=0;i<num_threads; i++)\n {\n pthread_data[i].d = new Data();\n }\n for (int i=0; i<num_threads; i++) {\n pthread_create(&threads[i], NULL, _add, (void*)(pthread_data+i));\n }\n for (int i=0; i<num_threads; i++) {\n pthread_join(threads[i], NULL);\n }\n sleep(1);\n unit_thread_data(pthread_data);\n return 0;\n}\nRun Code Online (Sandbox Code Playgroud)\n
delete[] pthread_data[i].d->A_;
Run Code Online (Sandbox Code Playgroud)
这将删除A_您的类的成员Data,即int *.
紧接着,就会发生这种情况:
delete pthread_data[i].d;
Run Code Online (Sandbox Code Playgroud)
这会删除它Data本身。Data的析构函数然后执行以下操作:
if(A_) {
delete A_;
}
Run Code Online (Sandbox Code Playgroud)
然后继续尝试delete相同的指针。首先应该是delete[]d 而不是d,但是这是没有意义的,因为这个指针已经是 d,并且第二次尝试它。deletedeletedelete
这会导致未定义的行为。