代码之家  ›  专栏  ›  技术社区  ›  ckv

悬挂指针

c++
  •  5
  • ckv  · 技术社区  · 14 年前

    这段代码是否会导致指针悬空。我猜不是。

    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 回复  |  直到 14 年前
        1
  •  8
  •   user168715    14 年前

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

        2
  •  0
  •   Big Al    14 年前

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

    但是请注意,除非将指针设置为 NULL

        3
  •  0
  •   Coding Mash desirejeet    12 年前

    因此,当您在s1上调用PrintVal()函数并尝试取消对指针的引用时,您的程序可能会在此阶段崩溃。。。。你可以删除一个指针一次,它的内存就会失控