delete之后千万要记得将指针置空,即勿重复delete!!!
2015-05-01 12:57
274 查看
下面这段代码有什么问题吗?(Arduino上运行)
事实上,如果我们输出指针arr1,arr2的值,就会发现内存根本就是乱分配的,改变参数后甚至有可能出现arr1与arr2指向的内存范围重合的情况。
那么是什么原因造成的呢?由于ptr在reset中delete后没有置为NULL ,导致了在析构中第二次delete。这么改就可以了:
教训:
1.delete之后一定马上及时置NULL
2.千万不能重复delete东西
class C{ public: C(){ ptr = new int[12]; } ~C(){ if(ptr!=NULL)delete [] ptr; } void reset(){ if(ptr!=NULL)delete [] ptr; } private: int *ptr; }; void f2(){ C c; c.reset(); } void f(){ f2(); int *arr1 = new int[5]; int *arr2 = new int[5]; //操纵arr1,arr2 }
事实上,如果我们输出指针arr1,arr2的值,就会发现内存根本就是乱分配的,改变参数后甚至有可能出现arr1与arr2指向的内存范围重合的情况。
那么是什么原因造成的呢?由于ptr在reset中delete后没有置为NULL ,导致了在析构中第二次delete。这么改就可以了:
void reset(){ if(ptr!=NULL){ delete [] ptr; ptr = NULL; } }
教训:
1.delete之后一定马上及时置NULL
2.千万不能重复delete东西
相关文章推荐
- delete一个指针之后,要记得设置为NULL
- delete一个指针之后,要记得设置为NULL
- 对指针调用delete之后要记得把指针赋值为nullptr
- free之后要记得指针置空
- delete指针之后应该赋值NULL
- 条款7:当使用new得指针的容器时,记得在销毁容器前delete那些指针
- 在删除一个指针之后,一定将该指针设置成空指针(即在delete *p之后一定要加上: p=NULL)
- delete 指针之后 ,只是释放了指针指向的内存空间,指针不会自动置为NULL,还有delete 遇到指针为NULL时不会调用析构函数
- delete指针之后应该赋值NULL
- delete指针之后应该赋值NULL
- Mongodb在renameCollection之后,记得千万要立即补建索引
- delete 指针之后 ,只是释放了指针指向的内存空间,指针不会自动置为NULL,还有delete 遇到指针为NULL时不会调用析构函数
- delete指针之后应该赋值NULL
- 用delete释放内存后,记得把指针赋空值啊!!!血的教训
- delete指针之后应该赋值NULL
- 指针被delete之后应该赋值NULL
- C++在delete指针之后是否要置为null
- Delete之后的指针
- Mongodb在renameCollection之后,记得千万要立即补建索引.
- C++用fstream打开文件之后,读一次文件后,再次读该文件却怎样也不能将文件的指针置到开头?