悬空指针

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
您认为什么是悬空指针? - Chris Bednarski
3个回答

8
是的。当您将s1传递给SomeFunc时,将调用Sample的复制构造函数。默认的复制构造函数执行浅拷贝,因此ptr将被删除两次。

0

是的,就像用户所说的那样。

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

请注意,如果您复制了指针并将其指向其他变量,则这些变量将会失去指向,除非它们也被设置为NULL

0
当你通过值将对象传递给SomeFunc()时,浅拷贝会发生,并且在执行完之后,指针所指向的内存已被删除... 因此,当你在s1上调用PrintVal()函数并尝试解引用指针时,你的程序可能会在这个阶段崩溃... 一旦你删除了一个指针,它的内存就会失去你的控制。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接