多线程段故障析构函数

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}\n
Run Code Online (Sandbox Code Playgroud)\n

Sam*_*hik 5

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

这会导致未定义的行为。