C++ 如何重载delete[]运算符以显示被释放的字节数?
我试图重载new/delete运算符,但显然重载delete[]运算符以显示释放的字节数并没有起到任何作用。下面您可以看到我的代码(编译时没有任何错误),new和delete工作正常,但delete[]甚至没有被调用。从我读到的内容来看:operator delete[]支持将字节数作为C++14之后的第二个参数(我目前正在使用visual studio 2019和C++17)C++ 如何重载delete[]运算符以显示被释放的字节数?,c++,operator-overloading,dynamic-memory-allocation,new-operator,delete-operator,C++,Operator Overloading,Dynamic Memory Allocation,New Operator,Delete Operator,我试图重载new/delete运算符,但显然重载delete[]运算符以显示释放的字节数并没有起到任何作用。下面您可以看到我的代码(编译时没有任何错误),new和delete工作正常,但delete[]甚至没有被调用。从我读到的内容来看:operator delete[]支持将字节数作为C++14之后的第二个参数(我目前正在使用visual studio 2019和C++17) #包括 使用名称空间std; void*运算符新(大小\u t大小){ 从it is“…未指定在删除不完整类型的对象以
#包括
使用名称空间std;
void*运算符新(大小\u t大小){
从it is“…未指定在删除不完整类型的对象以及非类和普通可破坏类类型的数组时是否调用[接受大小参数的重载]
。因此,请尝试删除大小\u t大小
参数(尽管它不符合您的目的,抱歉:-)次要问题:运算符新建[]
有一些额外的需求没有在这段代码中处理。这不会影响问题,而且代码可以进行快速和肮脏的调查。但是现实世界的实现会比这更复杂……用定义为struct{t(){}virtual~t()的简单结构t
替换int
{};
导致调用所需的重载(g++10.2.1,libstdc++.so.6)。这可能不是问题所在,但请记住,流插入器可能会分配内存,而内存反过来会使用替换的运算符new
或运算符new[]
。因此,当为操作符new
和操作符delete
编写调试代码时,经验法则是使用printf
,而不是插入到标准流中。gcc和clang都为int[20]
选择2而不是6(未指定为@G.M.)。如果您使用std::string[20]
,gcc将选择您的替代者-但叮当声将坚持2。
#include <iostream>
using namespace std;
void* operator new(size_t size) {
cout << "Allocating " << size << " bytes.\n";
if (void* ptr = malloc(size))
return ptr;
throw bad_alloc();
}
void operator delete(void* memory, size_t size) noexcept {
cout << "Freeing " << size << " bytes.\n";
free(memory);
}
void operator delete[](void* memory, size_t size) noexcept {
cout << "Freeing " << size << " bytes.\n";
free(memory);
}
int main() {
int* a = new int[20];
delete[] a;
return 0;
}