请帮助我,在我出错的地方,下面是我的代码,在删除或释放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;
}
答案 0 :(得分:3)
在p=x;
之后,p和x指向同一位置(最初指向的x
)。在其中任何一个上调用delete
将使另一个悬空并且在其上调用delete
将导致双重释放和未定义的行为。 p=x
也会导致内存泄漏,因为先前为p
分配的内存不再可用。
要分配值,而不是指针,请执行
*p = *x;
答案 1 :(得分:0)
问题是你有两次删除相同的指针,或更精确地删除两个指针所指向的相同内存区域。
陈述后
p=x;
两个指针p和x开始指向相同的内存区域。然后你首先删除p
delete p;
然后删除x
delete x;
但删除p时,x已指向的内存已被释放。
删除p之后,后面的所有代码都有未定义的行为
*x=14;
cout<<*x<<endl;
cout<<*p<<endl;
delete x;
要避免此问题,您可以使用智能指针std::shared_ptr
例如
#include <iostream>
#include <memory>
int main()
{
std::shared_ptr<int> x( new int );
std::shared_ptr<int> p( new int );
*x = 10;
*p = 12;
p = x;
std::cout << p << std::endl;
std::cout << x << std::endl;
std::cout << *p << std::endl;
std::cout << *x << std::endl;
*x = 13;
std::cout << *p << std::endl;
*x = 14;
std::cout << *x << std::endl;
std::cout << *p << std::endl;
return 0;
}
输出
0x95e6008
0x95e6008
10
10
13
14
14