C++ delete释放指针,悬浮指针
2013-05-22 14:58
113 查看
C++中使用delete删除指针,只是把指针指向的内存释放掉,并没有释放掉指针本身。
c++中的悬浮指针:声明了但没有被付值的指针,它指向内存中的任意一个空间。避免悬浮指针的一个方法是开始就付值为NULL
“野指针”不是NULL指针,是指向“垃圾”内存的指针。人们一般不会错用NULL指针,因为用if语句很容易判断。但是“野指针”是很危险的,if语句对它不起作用。野指针的成因主要有两种:
一、指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。
二、指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。别看free和delete的名字恶狠狠的(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。通常会用语句if (p != NULL)进行防错处理。很遗憾,此时if语句起不到防错作用,因为即便p不是NULL指针,它也不指向合法的内存块。例:
char *p = (char *) malloc(100);
strcpy(p, “hello”);
free(p); // p 所指的内存被释放,但是p所指的地址仍然不变
if(p != NULL) // 没有起到防错作用
strcpy(p, “world”); // 出错
另外一个要注意的问题:不要返回指向栈内存的指针或引用,因为栈内存在函数结束时会被释放。
strlen是对char*的,string不行,这个很容易让人误解啊
众所周知,最开始我们用new来创建一个指针,那么等我们用完它之后,一定要用delete将该指针删掉。但是,值得注意的是,难道就仅仅是删除这个指针这么简单的么?下面,我们用一个程序来说明这个问题:
在上面这个程序中,我们在第8行就将指针p利用delete删掉了。但是,我们来看看程序的输出结果:
c++中的悬浮指针:声明了但没有被付值的指针,它指向内存中的任意一个空间。避免悬浮指针的一个方法是开始就付值为NULL
“野指针”不是NULL指针,是指向“垃圾”内存的指针。人们一般不会错用NULL指针,因为用if语句很容易判断。但是“野指针”是很危险的,if语句对它不起作用。野指针的成因主要有两种:
一、指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。
二、指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。别看free和delete的名字恶狠狠的(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。通常会用语句if (p != NULL)进行防错处理。很遗憾,此时if语句起不到防错作用,因为即便p不是NULL指针,它也不指向合法的内存块。例:
char *p = (char *) malloc(100);
strcpy(p, “hello”);
free(p); // p 所指的内存被释放,但是p所指的地址仍然不变
if(p != NULL) // 没有起到防错作用
strcpy(p, “world”); // 出错
另外一个要注意的问题:不要返回指向栈内存的指针或引用,因为栈内存在函数结束时会被释放。
strlen是对char*的,string不行,这个很容易让人误解啊
众所周知,最开始我们用new来创建一个指针,那么等我们用完它之后,一定要用delete将该指针删掉。但是,值得注意的是,难道就仅仅是删除这个指针这么简单的么?下面,我们用一个程序来说明这个问题:
#include |
02 | using namespace std; |
03 | int main() |
04 | { |
05 | int *p=new int; |
06 | *p=3; |
07 | cout<<"将3赋给p的地址后,指针p读取的值:"<<*p<<endl; |
08 | delete p; |
09 | cout<<"删除空间后,指针p读取的值:"<<*p<<endl; |
10 | long *p1=new long; |
11 | *p1=100; |
12 | cout<<"创建新空间后,指针p中保存的地址:"<<p<<endl; |
13 | cout<<"指向新空间的指针p1保存的地址:"<<p1<<endl; |
14 | *p=23; |
15 | cout<<"将23赋给p的地址后,指针p读取的值:"<<*p<<endl; |
16 | cout<<"将23赋给p的地址后,指针p1读取的值:"<<*p1<<endl; |
17 | delete p1; |
18 | return 0; |
19 | } |
相关文章推荐
- 在C++动态库中释放调用动态库程序中生成的指针new和delete 或 malloc和free
- new、delete、指向连续空间的指针、数组、空间释放、空间申请[C++][内存管理]
- [C/C++][经典探讨]类继承中,通过基类指针delete释放,是否会造成内存泄漏 http://blog.csdn.net/code_godfather/article/details/66480
- [C/C++][经典探讨]类继承中,通过基类指针delete释放,是否会造成内存泄漏
- new、delete、指向连续空间的指针、数组、空间释放、空间申请[C++][内存管理]
- [C/C++][经典探讨]类继承中,通过基类指针delete释放,是否会造成内存泄漏
- new、delete、指向连续空间的指针、数组、空间释放、空间申请[C++][内存管理]
- [C/C++][经典探讨]类继承中,通过基类指针delete释放,是否会造成内存泄漏
- [C/C++][经典探讨]类继承中,通过基类指针delete释放,是否会造成内存泄漏
- [C/C++][经典探讨]类继承中,通过基类指针delete释放,是否会造成内存泄漏
- C++ 使用delete删除指针(1
- C/C++学习心得(1):保证delete()掉的是“真实”的指针
- C++动态分配内存可以用不同的指针来释放
- C#调用返回C++指针的缓冲区,并释放
- C++ 在堆上开辟与释放二维、三维指针
- C++中new和delete来创建和释放动态数组
- C++之失控指针、迷途指针、野指针、悬浮指针及空指针[转]
- 【C++】使用局部变量赋值而非引用,导致内存多次释放的野指针问题
- 关于C++中delete释放内存时效性问题
- C++由于指针对象释放,造成Std::__non_rtti_Object例外发生