新操作符是否保证分配连续的堆内存块?即,是否
在内存分配方面与相同。
或者说可能存在间隙吗?
objects=new Base[1024];
在内存分配方面与相同。
objects=(Base*)malloc(1024*sizeof(base));
或者说可能存在间隙吗?
是的,内存将是连续的。在分配方面,它与malloc
版本相同,但有几个区别(调用构造函数,new
不返回NULL
,malloc
不会抛出异常等)。
请注意,您不能混用new[]
和delete
或free
,您必须使用delete[] objects
来释放内存。
new
操作符实际上会做两个事情:首先,它会调用 operator new
函数,该函数将返回一个连续的内存块,该块足够对所有可能的类型进行适当的对齐(但也有例外,例如错误使用的放置 new); 然后它会调用对象的构造函数,该函数可以执行任何操作,包括分配额外的内存块,这些内存块与第一个内存块不相邻。new
运算符没有被重载,那么分配的内存块是连续的。但是如果它被重载了,我们就不知道了(一些恶意程序员可能已经重载了它?:D)
new[]
版本将调用每个对象的默认构造函数。 - edA-qa mort-ora-ydelete[]
可以调用正确数量的析构函数。当然,这只是一个微小的空间差异。 - edA-qa mort-ora-y