在C++中,new[]
和 delete[]
一定要配对使用的原因与C++的内存管理方式有关。这种配对使用确保了动态分配的数组能够被正确地构造、使用和销毁。以下是详细解释:
-
对象构造:当你使用
new[]
分配一个对象数组时,C++ 不仅分配内存,还会为数组中的每个对象调用构造函数(如果对象是类类型的话)。这是为了保证对象在使用前被正确初始化。 -
内存分配:
new[]
操作符分配的内存通常比new
分配的内存要多,因为除了对象数组本身占用的内存外,new[]
还会额外分配一些内存用于存储数组的大小信息。这个大小信息在delete[]
时被用来确定需要调用多少次析构函数。 -
对象析构:当使用
delete[]
释放对象数组时,C++ 会为数组中的每个对象调用析构函数(如果对象是类类型的话)。这是为了确保对象在使用后能够被正确清理。 -
内存释放:
delete[]
操作符会释放new[]
分配的全部内存,包括对象数组和额外的大小信息。
如果 new[]
与 delete
或 new
与 delete[]
不配对使用,将会导致以下问题:
-
使用
new[]
与delete
:这会导致只有数组的第一个对象被调用析构函数,而其余对象不会被销毁,造成资源泄露。此外,由于delete
不会读取数组大小信息,它可能不会释放为数组大小信息分配的额外内存。 -
使用
new
与delete[]
:这会导致为每个单独分配的对象调用析构函数,这可能不是问题,但更关键的是,delete[]
会尝试读取不存在的数组大小信息,这可能导致未定义行为,如程序崩溃。
因此,为了确保动态分配的数组能够被正确地构造、析构和释放内存,new[]
和 delete[]
必须配对使用。这是C++内存管理的规则,遵循这一规则可以避免内存泄露、未定义行为和程序崩溃等问题。