取消运算符delete []中的析构函数调用

斯蒂芬·伯格(Stefan Berger)

我正在编写一个内存泄漏检测器,该检测器会创建带有一些警告的文本​​文件。例如,它在delete使用发出警告,而不是delete[]释放使用分配的内存new[]

当在使用delete[]创建的对象上使用时,我发现同样困难,反之亦然new在这种情况下,析构函数将被调用以获取从未构造过的许多对象。

这是来自c ++参考的内容:

... delete []是一种具有非常特定行为的运算符:使用delete []运算符的表达式首先为数组中的每个元素调用适当的析构函数(如果它们属于类类型)...

我的问题是,我可以做些什么吗?为实际上尚未创建的对象调用析构函数通常会导致段错误。我想以某种方式“捕获”它,取消删除数组并创建警告。

编辑:似乎没有什么我可以做的。检查了另一块板,并获得了使用内存分配器的建议,这对于我的内存泄漏检测器来说是过高的,和/或研究valgrind的工作方式。我可能会做后者。

詹姆斯·坎泽

您可能什么也做不了,因为如果客户端代码调用delete,当new运算符为时new [],您可能不会在delete运算符中收到相同的地址。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么在运算符delete中不调用析构函数?

使用析构函数= delete;

指向子类的指针上的delete是否会调用基类的析构函数?

调用析构函数后,delete []会在一瞬间释放内存吗?

Delete []不调用元素析构函数

是否在重载的运算符delete函数中隐式调用析构函数?

如果类具有析构函数/删除[],则成员运算符new []的参数“ size”增加

来自libc ++的istringstream析构函数中对运算符delete的未定义引用

在析构函数中使用空条件运算符是一种不好的做法吗?

大小运算符delete []永远不会被调用

析构函数会自动在C ++中调用delete []吗?

重载运算符new []的行为取决于析构函数

为什么移动运算符不只是析构函数+移动构造函数

为什么虚拟析构函数需要删除运算符?

如果我还使用复制构造函数和重载=运算符,是否需要析构函数?

调用对象的析构函数是否等效于对该对象调用delete?

在派生类中定义析构函数需要复制赋值运算符

类析构函数导致重载+运算符的问题

当包含它的对象调用其析构函数时,unique_ptr是否会取消分配?

取消分配由全局替换运算符new返回的指针而不调用替换运算符delete的未定义行为?(C ++ 17)

std :: swap在构造函数,赋值运算符和析构函数方面如何工作?

C ++中的delete和free之间有什么区别,而C ++的默认析构函数调用了哪一个?

重载delete []运算符,以允许使用析构函数缩小类型的数组

从赋值运算符调用析构函数是否有任何意外的后果?

如何在移动分配运算符中调用析构函数?

析构函数调用

具有虚拟和非虚拟析构函数的删除运算符的不同行为

重载 -> shared_ptr<interface> 实例中的箭头运算符,接口中没有纯虚拟析构函数

链表:如何实现析构函数、复制构造函数和复制赋值运算符?