【发布时间】:2013-11-21 17:02:53
【问题描述】:
我很清楚在 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;
当遇到delete 时,内存管理器必须在其分配结构中查找数组指针值,无论它是什么,从该结构中找到num_objects 值,并标记相应的@987654333 @块内存为空闲。
除了 num_objects 在单个对象情况下被假定为 1 并在数组情况下在内部数据结构中查找之外,我看不出有什么区别。那么为什么delete 和delete[] 不能拼写相同呢?
换句话说,有什么问题
MyClass *object = new MyClass;
被实现为
MyClass *object = new MyClass[1];
这样 C++ 语法就不必区分 delete 和 delete[] 了吗?
【问题讨论】:
-
因为它不仅仅是释放内存,它还涉及调用适当的析构函数正确的次数。
-
new因此比new[]便宜一些,因为它不必存储必须调用析构函数的次数。 -
实际上对于某些编译器,实现是相同的,这就是为什么人们在写
delete array;然后在切换编译器时被咬的原因。
标签: c++ compiler-construction delete-operator