如何覆盖“标量删除析构函数()”?

时间:2012-03-15 00:25:44

标签: c++ memory

短篇小说。 。 。我试图覆盖新的和删除运算符。似乎没关系,但是在删除时我对这段代码有疑问

cCellList::~cCellList()
{
  STPINT loop;
  for (loop = 0; loop < count; loop++)
  {
    delete cells[loop];
  }
  free(cells);
}

这里的删除不是我的重写删除操作符,所以事情没有用。堆栈跟踪说

ExeName.exe!Cell::'scalar deleting destructor'()
ExeName.exe!cCellList::~cCellList()
ExeName.exe!Cell::'scalar deleting destructor'()

正在执行的代码行是

delete cells

其中cells的类型为cCellList *

长篇故事。我已经在这个可执行文件上工作了近20年,兼职,它有大约14 MB的源代码。所有非托管C ++,目前使用的是VS2010。我开始使用名为“Think C with Object-oriented extensions”的编译器。可能很多人都太年轻,不记得那些日子。

在某个地方存在内存管理问题,有时会导致奇怪的事情发生。我很早就已经过了这个程序可以使用像Purify这样的第三方解决方案。当我试图检测代码时,它们只是炸弹。所以我已经编写了我自己的malloc / free,我正在将它们挂起以便更好地跟踪记忆中发生的事情。到目前为止,我正在使用我自己的系统分配所有内存,但在这种情况下,它将转向正常的“免费”而不是我的,具有可预测的结果。

2 个答案:

答案 0 :(得分:1)

free(cells);

您是否使用malloc分配了内存?

如果是,请不要这样做。类与malloc不匹配。 new存在是有原因的。这里有各种各样的问题。

如果不是,则不要使用free取消分配。这是未定义的行为。如果您编写了cells = new Cell[n]来分配,则必须使用delete[] cells来解除分配。 free delete可能无法代替delete[]deletedelete[]可能无法代替{{1}},反之亦然,无论多少它“似乎工作”或谁告诉你它没关系。不行。

答案 1 :(得分:0)

delete运营商的声明是什么?

作为一般性评论,重写的malloc()/ free()应采用重写的全局new()/ delete()运算符的形式,不要忘记提供矢量版本。类似地,这个析构函数应该调用delete[] cells;而不是free(cells),假设'cells'是通过新单元[X]初始化的,它必须是新单元格,否则什么都行不通,特别是虚方法。