C ++中的逻辑删除和删除[]

时间:2014-02-15 00:36:22

标签: c++

在C中,free()用于释放内存,比如free(ptr)。据我所知,在库代码中的ptr之前分配额外的内存来存储块大小信息。调用free()后,将跟踪整个块,然后释放。

在C ++中,有两种形式的new和delete。一个是阵列。如果使用new[],则应使用delete[]。例如,

int ptr = new [10]; 
delete [] ptr;

问题1:我可以在这里使用delete ptr吗?如果可以,那该怎么办delete ptr + 2

问题2:如果必须使用delete[]来匹配new[],为什么我们需要两种删除形式?只需一种表格,比如delete,就够了。

感谢所有的建议!

感谢Mgetz。问题2应该是:为什么c ++标准提出删除[]和删除如果在任何情况下只有一个正确的形式?

2 个答案:

答案 0 :(得分:2)

Q1:可以使用delete,但这是错误的。

这通常会“正常”,因为它将正确释放分配的内存,但它不会正确调用析构函数。对于琐碎的类型,你通常不会看到任何差异,但这并不意味着它没有错。在任何情况下,如果可以的话,你应该避免使用未定义的行为(调用UB会失去你的代码可以保证的任何保证,它当然可以工作,但你永远不能100%确定)。
删除ptr+2也是未定义的行为,几乎肯定不会“起作用”,甚至一点也不行。通常,这只会导致程序崩溃。

Q2:你需要这两个,因为它们意味着不同的东西。一个意味着“删除此指针到单个对象”,而另一个意味着“删除此指针到对象数组”。
显然,编译器需要为那些不同的东西生成不同的代码。

答案 1 :(得分:0)

您需要这两种形式,因为与mallocfree不同,newdelete不仅可以分配和取消分配内存;他们还分别构造和破坏对象。

newdelete处理标量对象,而new[]delete[]处理对象数组。

当您致电new T[n]时,它会为n的{​​{1}}副本分配足够的内存,然后在分配的内存中构建T个实例。同样,调用n将导致销毁那些delete[]个实例,然后重新分配。

显然,由于您未将n传递给n,因此实施时某些信息被隐藏起来,但标准不要求实现销毁所有delete[]个对象如果你打电话给n。实现可能只是销毁第一个对象,它可能正常运行并销毁所有delete个对象,或者它可能导致demons to fly out of your nose

简单地说,它是未定义的行为,不知道会发生什么,这是最好的必须避免它。