为什么*必须*删除[]和删除不同?

Mic*_*ael 13 c++ compiler-construction delete-operator

我很清楚地知道,在C++中,什么delete[]是对new[],deletenew.这与C++语法无关.我想知道原因 delete[]被定义为与平原不同的东西delete.这有什么实施原因?

考虑一下这段代码会发生什么:

MyClass *object = new MyClass;
delete object;
Run Code Online (Sandbox Code Playgroud)

delete遇到存储器管理器具有查找在其分配结构,不管它是对象指针值,并标记对应sizeof(MyClass)的存储器作为自由块.

现在考虑一下这段代码会发生什么:

MyClass *array = new MyClass[ num_objects ];
delete [] array;
Run Code Online (Sandbox Code Playgroud)

delete遇到存储器管理器具有查找在其分配结构数组指针值,不管它是,发现num_objects从该结构值,并标记对应num_objects*sizeof(MyClass)的存储器作为自由块.

除了num_objects在单个对象案例中假设1并且在数组情况下查找内部数据结构之外,我没有看到差异.那么,为什么deletedelete[]不能一直拼写相同?

换句话说,出了什么问题

MyClass *object = new MyClass;
Run Code Online (Sandbox Code Playgroud)

被实施为

MyClass *object = new MyClass[1];
Run Code Online (Sandbox Code Playgroud)

让C++的语法就不会做出区分deletedelete[]

tem*_*def 22

原则上,这些可以以相同的方式实施.然而,在某处存储元素的数量,迭代这些元素,并在每个元素上调用析构函数(在时间和空间方面)都需要花费成本.

C++的核心理念之一是"不要为你不使用的东西买单".由于与程序员可能不想支付的基于数组的分配和释放例程相关的额外成本,该语言明确地使两个操作分开.

希望这可以帮助!

  • 如果你知道分配的内存块的大小,那么对象的数量就是`block_size/sizeof(MyClass)`.但是,由于技术原因,`malloc`(和`new`)可以分配比你要求的更大的块,所以这就是为什么`new []`可能仍然需要显式存储对象的数量. (2认同)

AnT*_*AnT 7

首先,功能new/delete不同于new[]/delete[].前者可用于执行多态分配和多态删除.后者根本不支持多态性.C++中的数组不是多态的,只有单个对象.可能有可能强制将这两个功能合并为一个,以便允许单个对象的多态删除并仍然保持数组的多态删除非法,但它看起来不会很漂亮.

其次,正如您可能知道的那样,典型的实现new[]将在分配的数组中存储确切的对象数,以便稍后delete[]调用适当数量的析构函数.但是,大多数现代实现实际上都遇到了在分配的类型具有普通析构函数时存储数组大小的麻烦.

他们为什么这样做?他们这样做是为了节省内存,即避免在可以避免的情况下存储大小.请注意,即使在相对内存丢失通常较小的情况下(一个size_t字段与对象数组相比),它们也会遇到所有麻烦.

所以,显然这种节省内存的技术被认为是值得的.

在这种情况下,显然在已知阵列大小正好为1的情况下应该更值得,即从这个角度来看,实现new T通过new T[1]会非常浪费.