2012-03-15 30 views
-1

短篇小说。 。 。我试图覆盖新的和删除操作符。似乎是新的好,但是,我删除有问题,此位的代码如何覆盖“标量删除析构函数()”?

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

的删除此处不会重写我的delete操作符,这样的事情是不工作了。堆栈跟踪说

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

正在执行的代码行是

delete cells 

其中cellscCellList *类型。

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

有些地方存在内存管理问题,有时会导致奇怪的事情发生。我很久以前就通过了Purify等第三方解决方案可以用于此计划的观点。当我尝试编写代码时,他们只是在弹。所以我写了自己的malloc/free,并且将它们挂钩以更好地跟踪内存中发生的事情。到目前为止,我正在用自己的系统分配所有的内存,但在这种情况下,它将以正常的“自由”而不是我的方式进行,并具有可预测的结果。

+2

如果你已经编写了大于20年的代码,你应该知道如何创建一个最小的测试用例。请创建一个,然后在这里发布,然后我们可以帮助你! – 2012-03-15 00:29:25

+0

另请参阅此问题:http://stackoverflow.com/questions/4948339/why-is-a-scalar-deleting-destructor-being-called-as-a-result-of-vector-delete-on。 – 2012-03-15 00:30:18

+0

你已经编写了将近20年的代码,而且你正在“编写你自己的malloc/free”,并且不知道如何在C++中使用operator new重载? – 2012-03-15 00:34:06

回答

1
free(cells); 

您是否分配了内存malloc

如果是的话,不要这样做。课程与malloc不搭配很好。 new存在的原因。这里可能出现各种各样的问题。

如果不是,则不要用free取消分配它。这是未定义的行为。如果您编写了cells = new Cell[n]来分配,则必须使用delete[] cells来取消分配。 free可能不会被deletedelete[]delete[]所替代,delete也可能不会被delete[]所取代,反之亦然,无论它们“看起来如何工作”或者谁告诉过您没关系。它不好。

0

delete运算符的声明是什么?作为一般性说法,您重写的malloc()/ free()应该采用覆盖全局new()/ delete()运算符的形式,不要忘记提供矢量版本。同样,这个析构函数应该调用delete[] cells;而不是free(cells),假设'单元格'是通过新单元格[X]初始化的,否则没有任何工作,特别是虚拟方法。