完全可以 . . . .
可能有不少人对Delete删除空指针的用法不屑一顾 , 但在实际运用当中 ,
却有不少人会犯类似的错误 , 最典型的如下:
if(pMyClass) //这里, pMyClass是指向某个类的指针 . .
{
delete pMyClass ;
}
他们往往先判断一下指针是否为空 , 如果不为空 , 说明没有被删除 ,
于是清空这个指针 . . .
出发点和逻辑思维是好的 , 但是却毫无必要 . . .
因为实际上delete 本身会自动检查对象是否为空 .如果为空 , 就不做操作 . .
所以直接用delete pMyClass 就可以了 . . .
删除空指针当然也是同样道理 . .
1. delete NULL 是没有问题的
char *p = NULL;
delete p;
2:delete栈上的空间是不行的
char *p = "1234";
delete p;
2. char *p = new char;
delete p;
delete p; // 不能删除两次,第一次delete p之后,p的地址并不是空,同一块内存释放两次是有问题的
3. 最好的风格是:
if(pMyClass) //这里, pMyClass是指向某个类的指针 . .
{
delete pMyClass ;
pMyClass = NULL; // 这句不能少
}
因为这段代码在一个函数中,避免函数被调用两次而引起问题
完全可以 . . . .可能有不少人对Delete删除空指针的用法不屑一顾 , 但在实际运用当中 , 却有不少人会犯类似的错误 , 最典型的如下:if(pMyClass) //这里, pMyClass是指向某个类的指针 . .{ delete pMyClass ;} 他们往往先判断一下指针是否为空 , 如果不为空 , 说明没有被删除 , 于是清空这个指针 . . .出发点和逻...
以上代码,因为指向的内存已经被释放,导致后面的调用失效,这种情况导致程序崩溃的原因会非常难找,而且出错的位置很难定位,开发时往往还容易遇到很多这种情况。
那么
delete
到底做了什么动作呢?
delete
指针只是释放了那个指针原本所指的内存而已,并没
C++
标准规定:
delete
空指针
是合法的,没有副作用。所以我们在
Delete
指针后赋值为NULL或0是个好习惯。对一个非
空指针
delete
后,若没有赋NULL,若再次
delete
的话有可能出现问题。
int *ptr = new int(3);
delete
ptr;
ptr = NULL;
可以看出
delete
是释放指针指向的内存,并不是指针本身所占有的内存。所以
delete
后,指针的还是指向那块区域,并未清0,所以如果下次用到,就会发生xxx空间
不能
访问的异常。以后
delete
后要赋值为空。
在
C++
中
delete
指针前不用进行指针是否为空的判断,因为
delete
的实现已经做了这件事情!
使用
delete
来
delete
已释放的指针是一个严重的错误,所以要在
delete
完一个指针后手动把它置空!
因为
delete
空指针
是安全的。
以下是Bjarne
Stroustrup's
C++
Style and Technique FAQ
中
的
Why does
在 C 语言
中
,没有 new 和
delete
这两个关键字。它们是
C++
中
的关键字,用于动态分配和释放内存。
在
C++
中
,new 和
delete
的用法如下:
1. 动态分配内存
使用 new 关键字动态分配内存,语法如下:
```
c++
int *ptr = new int; // 分配一个 int 类型的内存空间
这里,ptr 指向一个新分配的内存空间,它的大小为一个 int 类型的大小。如果分配失败,则抛出 bad_alloc 异常。
2. 动态分配数组
使用 new 关键字动态分配数组,语法如下:
```
c++
int *ptr = new int[10]; // 分配一个包含 10 个 int 类型元素的数组
这里,ptr 指向一个新分配的数组,它的大小为 10 个 int 类型元素的大小。如果分配失败,则抛出 bad_alloc 异常。
3. 释放内存
使用
delete
关键字释放动态分配的内存,语法如下:
```
c++
delete
ptr; // 释放 ptr 指向的内存空间
这里,ptr 指向一个动态分配的内存空间,使用
delete
关键字将其释放。如果指针为空,则不执行任何操作。如果释放一个非动态分配的内存空间,则行为未定义。
4. 释放数组
使用
delete
[] 关键字释放动态分配的数组,语法如下:
```
c++
delete
[] ptr; // 释放 ptr 指向的数组
这里,ptr 指向一个动态分配的数组,使用
delete
[] 关键字将其释放。如果指针为空,则不执行任何操作。如果释放一个非动态分配的数组,则行为未定义。