哪个指针要删除?

时间:2010-03-03 23:01:34

标签: c++ multithreading pointers heap

我正在尝试多线程,我设置了我的程序,以便我有一个结构/类的变量将被传递到每个线程进行处理。

在这个类中,有一些变量可以保存指向数组的指针,某些线程有一些公共数组,它们从这些数组中读取数据,而不是复制这些数组,指向每个指向一个数组的函数的指针。这些公共数组在主程序中初始化,然后类数组中的变量指向该数组,然后该数组又传递给线程。

我的问题是我应该使用delete命令终止该数组的哪个级别(主程序或线程)?另外,当我这样做时,其他指针会发生什么?它们是否会被自动删除,或者我必须手动跟踪它们。最后,如果我在另一个线程仍在使用它时意外删除了一个数组会发生什么?

谢谢,

-Faken

3 个答案:

答案 0 :(得分:1)

如果删除其他线程仍在使用的数组,则会出现未定义的行为,可能是崩溃。

对于你的情况,我建议在所有工作线程完成后在主线程中清理。

另一种可能性是使用共享指针,一旦没有线程使用它们就会自动释放资源(尽管要注意你需要保护对共享指针的访问 - 对于shared_ptr in MSVC的标准库受到保护automatically)。

答案 1 :(得分:1)

delete不会修改指针,但会使内存指向不可用。

因此,一旦删除某些内存,就无法引用它。对于作为多个指针的单个指针,情况也是如此:

您可以使用将使用引用计数的共享指针,这样只有在释放所有指针时才会删除底层内存。对于您的示例,您需要确保共享指针是线程安全的。

答案 2 :(得分:0)

进程(应用程序)内的所有变量都是跨线程共享的,对变量或内存的任何修改都将对所有有权访问它的线程产生影响,除非您使用的是线程本地存储(TLS)。

如果你删除一个数组,然后另一个线程使用它,结果就像你删除一个数组然后你在代码中的某个地方重新访问它(主要是因访问冲突而崩溃)。

对于“哪个级别”的问题,我认为最好通过创建对象的线程释放对象以避免混淆,并确保另一个线程不再需要这些对象。