2010-06-06 61 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()函数并尝试取消引用指针,你的程序可以在此阶段崩溃....你可以一次删除一个指针,它的内存成为了你的控制