C++ 在运算符delete[]中取消析构函数调用

C++ 在运算符delete[]中取消析构函数调用,c++,memory-leaks,operator-overloading,delete-operator,C++,Memory Leaks,Operator Overloading,Delete Operator,我正在写一个内存泄漏检测器,它创建一个带有一些警告的文本文件。例如,当使用delete而不是delete[]来释放使用new[]分配的内存时,它会生成一条警告 在使用new创建的对象上使用delete[]时,我发现困难是相同的,反之亦然。在这种情况下,将为一些从未构造过的对象调用析构函数 这是C++的参考文献: 。。。delete[]是一个具有非常特定行为的运算符:表达式 使用delete[]运算符,首先调用相应的析构函数 对于数组中的每个元素(如果这些元素属于类类型) 我的问题是,我能做点什么

我正在写一个内存泄漏检测器,它创建一个带有一些警告的文本文件。例如,当使用
delete
而不是
delete[]
来释放使用
new[]
分配的内存时,它会生成一条警告

在使用
new
创建的对象上使用
delete[]
时,我发现困难是相同的,反之亦然。在这种情况下,将为一些从未构造过的对象调用析构函数

这是C++的参考文献:

。。。delete[]是一个具有非常特定行为的运算符:表达式 使用delete[]运算符,首先调用相应的析构函数 对于数组中的每个元素(如果这些元素属于类类型)

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


编辑:看来我无能为力。检查了另一块电路板,得到了使用内存分配器的建议,这对我的内存泄漏检测器来说是一个致命的错误,和/或查看valgrind是如何工作的。我可能会做后者。

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

可以定义您自己的
删除
操作符-这是在Cube 2 Sauerbraten游戏中完成的。重载删除操作符我的第一个想法是覆盖删除操作符。我不确定是否可能重载,除了位置删除。无论如何,delete语句首先调用数组中每个元素的析构函数(出错时可能会导致segfault),然后调用每个元素的实际运算符delete。在调用运算符delete之前,会销毁指定的对象;你能做的不多。地址有什么帮助?@user3545224编译器需要地址才能传递给
操作符new
函数。