Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何重载delete[]运算符以显示被释放的字节数?_C++_Operator Overloading_Dynamic Memory Allocation_New Operator_Delete Operator - Fatal编程技术网

C++ 如何重载delete[]运算符以显示被释放的字节数?

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“…未指定在删除不完整类型的对象以

我试图重载new/delete运算符,但显然重载delete[]运算符以显示释放的字节数并没有起到任何作用。下面您可以看到我的代码(编译时没有任何错误),new和delete工作正常,但delete[]甚至没有被调用。从我读到的内容来看:operator delete[]支持将字节数作为C++14之后的第二个参数(我目前正在使用visual studio 2019和C++17)

#包括
使用名称空间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;
}