2014-03-06 106 views
0

請幫我我哪裏出錯了,下面是我的代碼,在刪除或釋放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

的問題是,你兩次刪除同一指針或者更準確地說是由兩個指針指向相同的內存區域。

聲明

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 
+0

那麼爲什麼刪除p後,* x = 14和cout << * x工作正常?它被刪除刪除p ....? – user3215228

+0

@ user3215228未定義的行爲未定義。任何事情都可能發生。 –

+0

@ user3215228查看我更新的帖子。 –

3

p=x;,p和X都指向相同的位置(一個x指向最初)。調用delete將使另一個懸掛並在其上調用delete將導致雙自由和未定義的行爲。 p=x也將導致內存泄漏,因爲之前爲p分配的內存不再可用。

要只是分配值,而不是指針,做

*p = *x; 
相關問題