指针动态分配(核心转储)

时间:2014-03-06 13:22:36

标签: c++ pointers

请帮助我,在我出错的地方,下面是我的代码,在删除或释放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;
}

2 个答案:

答案 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