牛骨文教育服务平台(让学习变的简单)
博文笔记

C++之delete常见错误总结

创建时间:2017-03-19 投稿人: 浏览次数:1964

1、动态分配内存后释放了一次,再次释放

1)直接删除2次

int main()
{
   int *a = new int(50);
   cout<<*a<<endl;
   delete a;
   delete a;
   return 0;
}

2)另外一个指针指向分配的内存,然后把这个2个指针都删除

int* p1 = new int(50);
int* p2 = p1; //p2和p1 现在指向同一内存地址
cout << *p1 << endl;
cout << *p2 << endl;
delete p1; //OK
delete p2; //ERROR! p2所指的内存,已通过delete p1而被释放,不可再delete一次



2、删除是一个普通指针或者不是一个指针

1)删除的是一个普通指针

nt  a = 50;
int *p = &a;
delete p

2) 删除的不是一个指针

string ss = "chenyu";
delete ss;



3、删除了由系统释放的指针

int* p = new int[50]; 
int chenyu[50];  
p = chenyu;  
delete [] p;


我们是想把要释放p最初通过new int[50]而得到的内存空间,但事实上,p那时已经指向chenyu[100]了。结果,第一、最初的空间并没有被释放。第二、girl[100] 本由系统自行释放,现在我们却要强行释放它。




4、删除动态分配的指针的时候没有指向最初的地址

int *p = new int[3];
*p = 1;
cout<<*p<<endl;
*p++ = 2;
cout<<*p<<endl;
delete[] p;
当一个指针通过 +,-等操作而改变了指向;那么在释放之前,应确保其回到原来的指向。如下所示:在 delete [] p 时,p指向的是第二个元素,结果该释放将产生错位:第一个元素没有被释放,而在最后多删除了一个元素 正确代码如下:
int *p = new int[3];
*p = 1;
cout<<*p<<endl;
*p++ = 2;
p--;
cout<<*p<<endl;
delete[] p;


读者可以亲自测试错误,然后再去修正,这里就没有贴错误的效果是什么




声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。