c++垃圾收集和调用析构函数

标签 c++ garbage-collection

我需要按帧分配一些数据,这些数据需要保留到帧结束。

目前,我正在从一个不同的内存池中分配数据,这样我就可以用帧数来标记它。在帧的末尾,我遍历内存池并删除在特定帧中分配的内存。

我遇到的问题是,为了保留数据,我必须将它放在一个结构中:

struct FrameMemory
{
    uint32 frameIndex;
    bool allocatedType; //0 = new(), 1 = new[]
    void* pMemPtr;
}

所以稍后,当我开始释放内存时,它看起来像这样:

{
for(all blocks)
 if(block[i].frameIndex == targetIndex)
     if(block[i].allocatedType == 0)
          delete block[i].pMemPtr;
     else if (block[i].allocatedType ==1)
          delete[] block[i].pMemPtr;
}

问题是,因为我必须将指向内存的指针作为 void* 重载,所以 DELETE 运算符无法正确地将内存作为其“ native 基类型”删除。 IE 永远不会为该对象调用析构函数。

我试图找到使用智能指针模板化对象的解决方案,但为了做到这一点,我必须将模板化类重载为非模板化基类型,这使得删除更加困难.

有人能解决这样的问题吗?

最佳答案

如果您不想强制所有对象都继承自 Destructible,您可以存储指向删除函数(或仿函数)的指针以及指向数据本身的指针。客户端代码负责提供一个知道如何正确删除数据的函数,通常是这样的:

void xxx_deleter(void *data) { 
    xxx *ptr = static_cast<xxx *>(data);
    delete ptr;
}

虽然删除器通常与上面的很像,但这也为客户端提供了存储复杂数据结构并仍然正确删除它们的选项。

关于c++垃圾收集和调用析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2028561/

相关文章:

c++ - 单字分割算法

c# - 垃圾回收应该已经删除了对象,但 WeakReference.IsAlive 仍然返回 true

c# - 循环中不可访问对象的垃圾收集

python-3.x - Numpy 的按位运算和垃圾收集器

c++ - 有没有办法从 string_view 创建字符串流而不复制数据?

c++ - 为什么可以使析构函数成为纯虚函数

c++ - 查询 lambda/函数的参数数量

c++ - 我想要一个由空格分隔的 cstrings 数组

actionscript-3 - 在 actionscript 和 Flex 中管理大型应用程序的 EventListener 的最佳方法

c# - 使用带有终结器的 C++/CLI 定义类时 C# 中的内存泄漏