下面这段代码有什么问题吗?(Arduino上运行)
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东西