C++的new运算符 - 内存布局

6
新操作符是否保证分配连续的堆内存块?即,是否
objects=new Base[1024];

在内存分配方面与相同。
objects=(Base*)malloc(1024*sizeof(base));

或者说可能存在间隙吗?
3个回答

8

是的,内存将是连续的。在分配方面,它与malloc版本相同,但有几个区别(调用构造函数,new不返回NULLmalloc不会抛出异常等)。

请注意,您不能混用new[]deletefree,您必须使用delete[] objects来释放内存。


这并不完全相同。new[]版本将调用每个对象的默认构造函数。 - edA-qa mort-ora-y
抱歉,我今天可能有点糊涂了。新版本将分配更多的空间来记住数组的大小,以便delete[]可以调用正确数量的析构函数。当然,这只是一个微小的空间差异。 - edA-qa mort-ora-y
1
@edA-qamort-ora-y 那个评论是误导性的。它将精确地分配您指示的内存量。实现可能会保留一些内存来跟踪长度,但这是一个实现细节。它在标准中没有出现过。 - Luchian Grigore
1
@edA-qamort-ora-y:这并不像“free”神奇地知道分配区域的大小。那里需要一个类似的结构。 - KillianDS

3
也许是这样的。 new 操作符实际上会做两个事情:首先,它会调用 operator new 函数,该函数将返回一个连续的内存块,该块足够对所有可能的类型进行适当的对齐(但也有例外,例如错误使用的放置 new); 然后它会调用对象的构造函数,该函数可以执行任何操作,包括分配额外的内存块,这些内存块与第一个内存块不相邻。

0
如果new运算符没有被重载,那么分配的内存块是连续的。但是如果它被重载了,我们就不知道了(一些恶意程序员可能已经重载了它?:D)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接