请帮助我哪里出错了,下面是我的代码,在删除或释放 x 之前它工作正常但在删除 x 之后它显示我已转储核心。我不知道为什么。我所做的是,我用 new 关键字在堆中分配了 2 个变量,然后是 p=x,这意味着 p 现在拥有 x 的地址。然后我释放 p,最后我释放 x。请帮助我哪里出错了。
#include <iostream>
using namespace std;
int main(){
int a;
int *b=&a;
cout<<b<<endl;//address of a
int *x=new int;
cout<<x<<endl;
cout<<*x<<endl;
int *p=new int;
*x=10;
*p=12;
p=x;
cout<<p<<endl;
cout<<x<<endl;
cout<<*p<<endl;
cout<<*x<<endl;
*x=13;
cout<<*p<<endl;
delete p;
*x=14;
cout<<*x<<endl;
cout<<*p<<endl;
delete x;
return 0;
}
最佳答案
在 p=x;
之后,p 和 x 指向相同的位置(x
最初指向的位置)。在任何一个上调用 delete
都会使另一个悬空,在其上调用 delete
将导致双重释放和未定义的行为。 p=x
也会导致内存泄漏,因为之前分配给 p
的内存不再可用。
只分配值,而不是指针,做
*p = *x;
关于c++ - 指针动态分配(核心转储),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22225850/