Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 指向同一对象的两个指针_C++_Memory Management - Fatal编程技术网

C++ 指向同一对象的两个指针

C++ 指向同一对象的两个指针,c++,memory-management,C++,Memory Management,我有两个指针指向同一个对象,我需要正确地删除它们(删除每个对象A和内部对象B)。但问题是,共享对象在删除后仍有分配的内存:一个悬空指针。如果不使用智能指针,如何避免此类问题 class A { public: class B { private: A* m_x; A* m_y; public:

我有两个指针指向同一个对象,我需要正确地删除它们(删除每个对象A和内部对象B)。但问题是,共享对象在删除后仍有分配的内存:一个悬空指针。如果不使用智能指针,如何避免此类问题

     class A
        {

        public:
            class B
            {
            private:
                A* m_x;
                A* m_y;
            public:
                B(A* x, A* y);
                ~B();
            };

            B* m_b;
            A(){};
            void Join(A* other);
            ~A();
        };

        void A::Join(A* person)
        {
           this->m_b= new A::B(this, person);
           person->m_b= this->m_b;
        }

        A::~A()
        {
          if (m_b)
          {
            delete m_b;
            m_b= NULL;
          }
        }

        ...

        A aa = new A();
        A cc = new A();
        aa->Join(cc);
        delete aa

        // here I have a problem in deleting the *m_b because it's deleted by the first A 
        delete cc;

如果没有智能指针,最好是在销毁时将
aa
cc
分开。但不要这样做,请使用std::shared_ptr并忘记类似的问题:

// annul pointers to this shared object
B::detach() {
    if (m_x) m_x->m_b = NULL;
    if (m_y) m_y->m_b = NULL;
}

A::~A() {
    // use a temporary pointer, because B::detach will annul the pointers here
    if (m_b) {
        B* tmp = m_b;
        tmp->detach();
        delete tmp;
    }
}

这样的代码非常糟糕。它是不可维护的,类是耦合的,我甚至不确定它是否正确。

你能展示你的析构函数
~A()
~B()
?如果你不想使用
std::shared_ptr
@MaksimSolovjov我添加了我的A析构函数@πάντα,你可能需要自己实现引用计数ῥεῖ 我不明白,请解释一下more@Caramiriel因为它可能已经在
A::Join
中分配了它,谢谢它解决了这个问题,但是你能给我一个关于如何使用std::shared_ptrIf解决它的例子吗?如果你在原始代码的每个地方都使用智能指针而不是常规指针,而在析构函数中什么都不做,当
aa
cc
都超出范围时,所有三个对象都将被销毁。这是一个稍微不同的逻辑,但我认为它更可取,因为它很简单。同时,只要
aa
cc
中至少有一个存在,所有三个对象都将存在;然而,这很少是一个问题