关于delete的使用方法.....

来源:百度知道 编辑:UC知道 时间:2024/05/18 07:38:00
我经常看到有的用delete[] 有的直接用delete.

到底是什么情况下用delete[],什么情况下直接用delete?

大哥们能说明下吗?最好用例子说明..
这个没数组的为什么也用delete[]?
#include<iostream>
#include<conio.h>

int* fn() {
int* ap = new int;
return ap;
}
int main() {
int* bp=fn();
*bp = 15;
std::cout<<*bp<<"\n";
delete[] bp;
getch();
}

该用delete[]的地方就应该用delete[], 不能用delete。
delete[]是用来删除动态分配的数组,delete是用来删除动态分配的单个对象。

而且相应的new形式要用相应的delete形式来匹配。(new[] - delete[], new - delete)

当我们是用new表达式的时候,系统主要会做两件事,一,就是调用标准库里的operator new函数给我们分配一块原始的内存区,operator new的功能和malloc差不多(其实operator new在底层也是调用malloc函数); 二,在这片原始的内存区上调用对象的构造函数构造一个对象。
用delete表达式的时候,步骤也是相应的。首先调用析构函数撤销掉内存区间上的一个对象,然后使用标准库的operator delete函数将内存区返回给操作系统。
所以在C++里会有重载operator new和operatordelete函数的说法,将内存分配的工作接管过来。

补充回答:
要被删除的指针指向的是单个对象呢,还是对象数组?这只有你显示编码来告诉delete。如果你在用delete时没用括号,delete就会认为指向的是单个对象,否则,它就会认为指向的是一个数组。
如果你没有对数组对象用delete[]而是delete,或者对单个对象使用delete[]而不是delete,根据C++的标准,结果是未定义的。
什么叫未定义呢?就是可能正确,也可能不正确。
你的代码很简单,100行都不到,当然没什么问题,但是可以想一下要是一个10万行的代码出现这种错误呢?比如一个服务器程序,可能第一天运行正确,第二天就错误不断了。

总之,相应的new要用相应的delete形式。
具体细节可以参考<Effective C++>Item5. (业内戏称为50戒)

另外你那段代码严格来说是不正确的,可能是那本不太好的书上来的吧?
看书还是要看经典,就C++来讲2本书足矣,<C++ Primer>或者<The C++ Programming Language>加上<