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