叼着指针

时间:2010-06-06 05:01:15

标签: c++

这段代码是否导致悬空指针。我的猜测是否定的。

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();
}

3 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:0)

是的,正如用户所说。

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

但是请注意,除非它们设置为NULL,否则您复制指针的任何指针都会悬空。

答案 2 :(得分:0)

当你通过值将对象传递给SomeFunc()时,浅拷贝正在发生,并且在执行之后,指向的内存ptr已被删除... 因此,当您在s1上调用PrintVal()函数并尝试取消引用指针时,您的程序可能会在此阶段崩溃....您可以删除指针一次并且其内存不受控制