我很清楚,在C++中,delete[]对于new[],delete对于new是一样的。这与C++语法无关。我想知道为什么 delete[]被定义为与普通delete不同的东西。实施的原因是什么?
考虑一下这段代码会发生什么:
MyClass *object = new MyClass;
delete object;当遇到delete时,内存管理器必须查找其分配结构中的对象指针值,不管它是什么,并将相应的sizeof(MyClass)内存块标记为空闲。
现在,考虑一下这段代码会发生什么:
MyClass *array = new MyClass[ num_objects ];
delete [] array;当遇到num_objects时,内存管理器必须在其分配结构中查找数组指针值,无论它是什么,从该结构中查找值,并将相应的num_objects*sizeof(MyClass)内存块标记为空闲。
除了假设num_objects在单个对象情况下为1,并在数组情况下查找内部数据结构之外,我没有看到区别。那么,为什么delete和delete[]不可能拼写相同呢?
换句话说,有什么问题
MyClass *object = new MyClass;正在实施中
MyClass *object = new MyClass[1];这样C++语法就不必区分delete和delete[]了?
发布于 2013-11-21 17:07:45
原则上,可以以同样的方式执行这些原则。但是,在某个地方存储元素的数量,迭代这些元素,并在每个元素上调用析构函数(无论是在时间上还是在空间方面)都是有代价的。
C++的核心理念之一是“不要为不使用的东西付费”。由于与程序员可能不愿支付的基于数组的分配和去分配例程相关的额外成本,因此该语言显式地将这两个操作分开。
希望这能有所帮助!
发布于 2013-11-21 18:33:58
首先,new/delete的功能不同于new[]/delete[]的功能。前者可用于执行多态分配和多态删除。后者根本不支持多态性。C++中的数组不是多态的,只有单个对象是多态的。可能有可能强行将这两个功能合并为一个,以便允许对单个对象进行多态删除,同时仍然保持数组的多态删除是非法的,但看起来并不好看。
其次,您可能知道,new[]的一个典型实现将在分配的数组中存储确切数量的对象,供delete[]稍后使用以调用适当数量的析构函数。然而,大多数现代实现实际上都会遇到困难,即当分配的类型具有微不足道的析构函数时,不存储数组大小。
他们为什么要这么做?这样做是为了节省内存,即避免在可以避免的情况下存储大小。请注意,即使在相对内存损失较小的情况下(与对象数组相比,有一个size_t字段),它们也会经历所有这些麻烦。
因此,显然这种节省内存的技术是值得努力的。
在这种情况下,在已知数组大小为1的情况下,显然更值得这样做,也就是说,从这个角度来看,通过new T实现new T[1]是非常浪费的。
https://stackoverflow.com/questions/20127357
复制相似问题