【问题标题】:How do I override the "scalar deleting destructor()"?如何覆盖“标量删除析构函数()”?
【发布时间】:2012-03-15 00:25:43
【问题描述】:

短篇小说。 . .我正在尝试覆盖 new 和 delete 运算符。新的似乎没问题,但删除时我对这段代码有问题

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,并将它们连接起来以更好地跟踪内存中发生的情况。到目前为止,我正在用我自己的系统分配所有内存,但在这种情况下,它会转到正常的“免费”而不是我的,结果可预测。

【问题讨论】:

  • 如果你已经编码超过 20 年,你应该知道如何创建一个最小的测试用例。请创建一个,然后在此处发布,然后我们可以为您提供帮助!
  • 另请参阅此问题:stackoverflow.com/questions/4948339/…
  • 你已经编码了将近 20 年,而且你正在“编写自己的 malloc/free”,却不知道如何在 C++ 中使用 operator new 重载?!跨度>

标签: c++ memory


【解决方案1】:
free(cells);

你用malloc分配内存了吗?

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

如果不是,则不要使用free 释放它。那是未定义的行为。如果你写了cells = new Cell[n] 来分配,你必须使用delete[] cells 来解除分配。 free 不能代替 deletedelete[]delete 不能代替 delete[],反之亦然没关系。不行。

【讨论】:

    【解决方案2】:

    delete 运算符的声明是什么?

    一般来说,您被覆盖的 malloc()/free() 应该采用被覆盖的全局 new()/delete() 运算符的形式,不要忘记提供向量版本。同样,这个析构函数应该调用delete[] cells; 而不是free(cells),假设'cells' 是通过新的cells[X] 初始化的,它必须是这样,否则什么都不会起作用,特别是虚拟方法。

    【讨论】:

      猜你喜欢
      • 2013-04-27
      • 2011-03-23
      • 1970-01-01
      • 1970-01-01
      • 2014-04-11
      • 2015-08-11
      • 2018-01-02
      • 2017-04-21
      • 1970-01-01
      相关资源
      最近更新 更多