短篇小说。 。 。我试图覆盖新的和删除运算符。似乎没关系,但是在删除时我对这段代码有疑问
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,我正在将它们挂起以便更好地跟踪记忆中发生的事情。到目前为止,我正在使用我自己的系统分配所有内存,但在这种情况下,它将转向正常的“免费”而不是我的,具有可预测的结果。
答案 0 :(得分:1)
free(cells);
您是否使用malloc
分配了内存?
如果是,请不要这样做。类与malloc
不匹配。 new
存在是有原因的。这里有各种各样的问题。
如果不是,则不要使用free
取消分配。这是未定义的行为。如果您编写了cells = new Cell[n]
来分配,则必须使用delete[] cells
来解除分配。 free
delete
可能无法代替delete[]
或delete
,delete[]
可能无法代替{{1}},反之亦然,无论多少它“似乎工作”或谁告诉你它没关系。不行。
答案 1 :(得分:0)
delete
运营商的声明是什么?
作为一般性评论,重写的malloc()/ free()应采用重写的全局new()/ delete()运算符的形式,不要忘记提供矢量版本。类似地,这个析构函数应该调用delete[] cells;
而不是free(cells)
,假设'cells'是通过新单元[X]初始化的,它必须是新单元格,否则什么都行不通,特别是虚方法。