【问题标题】:Which pointer to delete?要删除哪个指针?
【发布时间】:2011-01-23 10:59:46
【问题描述】:

我正在尝试对某些东西进行多线程处理,并且我已经设置了我的程序,以便我有一个结构/变量类,这些变量将被传递到每个线程进行处理。

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

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

谢谢,

-伪造

【问题讨论】:

    标签: c++ multithreading pointers heap-memory


    【解决方案1】:

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

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

    另一种可能性是使用共享指针,它会在没有线程使用资源时自动释放资源(但请注意,您需要保护对共享指针的访问 - 对于 MSVC 标准中的 shared_ptr库受保护automatically)。

    【讨论】:

      【解决方案2】:

      delete 不会修改指针,而是使指向的内存不可用。

      因此,一旦删除了某些内存,就无法引用它。这对于单个指针和多个指针一样适用:

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

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-08-09
          • 1970-01-01
          • 2010-09-08
          • 2016-07-22
          • 2021-12-29
          • 2018-05-14
          • 1970-01-01
          相关资源
          最近更新 更多