gpt4 book ai didi

c++ - 为什么 new[] 分配额外的内存?

转载 作者:太空狗 更新时间:2023-10-29 20:07:41 25 4
gpt4 key购买 nike

我正在阅读“Thinking in C++”,我对 new 运算符感到困惑。这是书中的代码:

//: C13:ArrayOperatorNew.cpp
// Operator new for arrays

#include <new> // Size_t definition
#include <fstream>

using namespace std;

ofstream trace("ArrayOperatorNew.out");

class Widget
{
enum { sz = 10 };
int i[sz];

public:

Widget() { trace << "*"; }
~Widget() { trace << "~"; }

void* operator new(size_t sz)
{
trace << "Widget::new: "
<< sz << " bytes" << endl;
return ::new char[sz];
}

void operator delete(void* p)
{
trace << "Widget::delete" << endl;
::delete []p;
}

void* operator new[](size_t sz)
{
trace << "Widget::new[]: "
<< sz << " bytes" << endl;
return ::new char[sz];
}

void operator delete[](void* p)
{
trace << "Widget::delete[]" << endl;
::delete []p;
}
};

int main()
{
trace << "new Widget" << endl;
Widget* w = new Widget;
trace << "\ndelete Widget" << endl;
delete w;
trace << "\nnew Widget[25]" << endl;
Widget* wa = new Widget[25];
trace << "\ndelete []Widget" << endl;
delete []wa;
} ///:~

这里是“ArrayOperatorNew.out”中跟踪的内容

new Widget
Widget::new: 40 bytes
*
delete Widget
~Widget::delete
new Widget[25]
Widget::new[]: 1004 bytes
*************************
delete []Widget
~~~~~~~~~~~~~~~~~~~~~~~~~
Widget::delete[]

我对 1004 这个数字感到困惑。为什么它不是 1000?书上说:

This extra four bytes is where the system keeps information about the array, in particular, the number of objects in the array.

但是系统是什么?这是如何实现的?编译器在这里有帮助吗?

最佳答案

当使用 new[] 时,运行时需要一些方法来记住分配的数组大小,因此它知道在使用 delete[] 时要释放多少。在您的特定实现中,它的内存方式是分配额外的四个字节来保存大小(它不必以这种方式工作)。

您可以在 C++ FAQ 中阅读更多相关信息.

关于c++ - 为什么 new[] 分配额外的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1728158/

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