在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 ++标准提出删除[]和删除如果在任何情况下只有一个正确的形式?
答案 0 :(得分:2)
Q1:您可以使用delete
,但这是错误的。
这通常会“正常”,因为它将正确释放分配的内存,但它不会正确调用析构函数。对于琐碎的类型,你通常不会看到任何差异,但这并不意味着它没有错。在任何情况下,如果可以的话,你应该避免使用未定义的行为(调用UB会失去你的代码可以保证的任何保证,它当然可以工作,但你永远不能100%确定)。
删除ptr+2
也是未定义的行为,几乎肯定不会“起作用”,甚至一点也不行。通常,这只会导致程序崩溃。
Q2:你需要这两个,因为它们意味着不同的东西。一个意味着“删除此指针到单个对象”,而另一个意味着“删除此指针到对象数组”。
显然,编译器需要为那些不同的东西生成不同的代码。
答案 1 :(得分:0)
您需要这两种形式,因为与malloc
和free
不同,new
和delete
不仅可以分配和取消分配内存;他们还分别构造和破坏对象。
new
和delete
处理标量对象,而new[]
和delete[]
处理对象数组。
当您致电new T[n]
时,它会为n
的{{1}}副本分配足够的内存,然后在分配的内存中构建T
个实例。同样,调用n
将导致销毁那些delete[]
个实例,然后重新分配。
显然,由于您未将n
传递给n
,因此实施时某些信息被隐藏起来,但标准不要求实现销毁所有delete[]
个对象如果你打电话给n
。实现可能只是销毁第一个对象,它可能正常运行并销毁所有delete
个对象,或者它可能导致demons to fly out of your nose。
简单地说,它是未定义的行为,不知道会发生什么,这是最好的必须避免它。