gpt4 book ai didi

c++ - sized operator delete[] 永远不会被调用

转载 作者:太空狗 更新时间:2023-10-29 21:10:04 26 4
gpt4 key购买 nike

我正在尝试跟踪在我的开发中分配了多少内存。跟踪分配很容易,因为 void *operator new (size_t)void *operator new[](size_t) 的重载允许跟踪分配了多少.使用 C++ < C++14,one can resort to a technique of over-allocating memory to store the size of the allocation

从C++14开始就有对应的void operator delete(void*p, size_t size)void operator delete[](void*p, size_t size) 这应该允许准确说明每次取消分配(不完整类型的删除除外,然后留给实现)。

但是,尽管第一个版本由 g++ 调用,其中调用删除单个对象,但我还没有找到一个编译器调用第二个版本。这是我的测试代码:

#include <iostream>
size_t currentAlloc;

void * operator new(size_t size)
{
currentAlloc += size;
std::cout << "1\n";
return malloc(size);
}

void *operator new[](size_t size)
{
std::cout << "3\n";
currentAlloc += size;
return malloc(size);
}

void operator delete(void *p) noexcept
{
std::cout << "Unsized delete\n";
free(p);
}

void operator delete(void*p, size_t size) noexcept
{
std::cout << "Sized delete " << size << '\n';
currentAlloc -= size;
free(p);
}

void operator delete[](void *p) noexcept
{
std::cout << "Unsized array delete\n";
free(p);
}

void operator delete[](void*p, std::size_t size) noexcept
{
std::cout << "Sized array delete " << size << '\n';
currentAlloc -= size;
free(p);
}

int main() {
int *n1 = new int();
delete n1;

int *n2 = new int[10];
delete[] n2;

std::cout << "Still allocated: " << currentAlloc << std::endl;
}

使用 g++ -std=c++14 test.Cclang++ -std=c++14 test.C 编译。 g++ 的输出结果:

1
Sized delete 4
3
Unsized array delete
Still allocated: 40

我期望为第二个 delete 调用大小数组 delete 并且最后打印的值为 0 而不是 40。clang++ 不会调用任何大小的取消分配,也不会英特尔编译器。

我的代码有任何错误吗?我误解了标准吗?还是 g++ 和 clang++ 都不符合标准?

最佳答案

根据 cppreference.com ,这通常是可靠的,但未指定“删除不完整类型的对象和非类和普通可破坏类类型的数组时调用哪个版本”(我的重点)。

编译器似乎默认禁用大小删除。

关于c++ - sized operator delete[] 永远不会被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55926085/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com