gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:17:53 25 4
gpt4 key购买 nike

以下代码片段重载operator new[]并打印出所需的size和指针地址

class MyClass
{
private:
int _data; //sizeof(MyClass) == 4

public:
void* operator new[](size_t size)
{
cout << "MyClass::operator new[]" << endl;
cout << "size = " << size << endl;
void* p = malloc(size);
cout << "p = " << p << endl;
return p;
}
};

int main()
{
MyClass* a = new MyClass[100];
cout << "a = " << a << endl;
}

输出

>>  MyClass::operator new[]
>> size = 400
>> p = 0x55e335a3f280
>> a = 0x55e335a3f280

但是,通过显式添加/定义析构函数

class MyClass
{
...
public:
...
~MyClass() {}
};

int main()
{
MyClass* a = new MyClass[100];
cout << "a = " << a << endl;
}

结果改变了

>>  MyClass::operator new[]
>> size = 408
>> p = 0x564f30cd7280
>> a = 0x564f30cd7288

表示表达式 new[] 正在向 operator new[] 请求额外的 8 字节内存。多出的内存字节好像是存放数组的大小,甚至可以访问!

cout << "info: " << *(reinterpret_cast<size_t*>(a) - 1) << endl;

结果

>>  info: 100

我的问题是谁以及为什么使用这 8 字节的信息?这是标准的一部分吗?如果是这样,是否可以解释为什么它被设计为以这种方式运行?

最佳答案

unspecified调用任何数组 new 时是否有开销,有多少开销。这种行为完全在提供给编译器的宽大处理范围内。额外的空间通常用于指示数组中有多少个元素。

在调用delete[]时,需要调用每个元素的析构函数;这只有在我们知道有多少元素的情况下才能做到。在元素具有普通析构函数的情况下,不需要调用它们,因此不需要空间。

请注意,虽然实现通常在 operator delete 中委托(delegate)给 std::free,但不能保证,您应该重载 operator delete

关于c++ - 重载运算符 new[] 的行为取决于析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53095826/

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