2010-06-06 90 views
5

請問這段代碼導致懸擺指針。我的猜測是否定的。懸掛指針

class Sample 
{ 
public: 
int *ptr; 
Sample(int i) 
{ 
ptr = new int(i); 
} 

~Sample() 
{ 
delete ptr; 
} 
void PrintVal() 
{ 
cout << "The value is " << *ptr; 
} 
}; 

void SomeFunc(Sample x) 
{ 
cout << "Say i am in someFunc " << endl; 
} 

int main() 
{ 
Sample s1 = 10; 
SomeFunc(s1); 
s1.PrintVal(); 
} 
+1

什麼是你一個懸擺指針的定義? – 2010-06-06 05:05:03

回答

8

是的。當您將s1傳遞給SomeFunc時,會調用Sample的拷貝構造函數。默認的拷貝構造函數做一個淺拷貝,所以ptr會被刪除兩次。

0

是的,正如網友說。

~Sample() { 
    delete ptr; // Pointer deleted but left dangling 
    ptr = NULL; // Pointer is no longer dangling 
} 

不過請注意,任何指針複製該指針將留給晃來晃去,除非它們被設置爲NULL爲好。

0

當您通過值將對象傳遞給SomeFunc()時,發生淺拷貝並執行後,內存ptr指向已刪除... 因此,當您調用s1上的PrintVal()函數並嘗試取消引用指針,你的程序可以在此階段崩潰....你可以一次刪除一個指針,它的內存成爲了你的控制