我有几个通过指针共享数据的对象。指针参数是在构造函数中发送的,如下所示。
class A
{
public:
Shared* pB = new Shared();
User* object1 = new User(pB);
User* object2 = new User(pB);
}
class User
{
public:
User(Shared* pB) {m_sharedB = pB};
private:
Shared* m_sharedB;
}
class Shared
{
public:
struct Account
{
int account_number;
}
void method(){...};
}
我的问题与C ++析构函数有关。当object1被删除时,成员变量“m_sharedB”会发生什么?是否存在悬挂指针给其他同行的问题?
答案 0 :(得分:6)
如果您的类包含指针成员,
class Foo
{
Bar * mp_bar;
};
然后在销毁Foo
对象时,除了指针及其包含的对象超出范围之外,没有任何其他事情发生。它与以下函数末尾p
的内容相同:
void bar()
{
int * p;
}
你可能要问的是“指针指向的对象会发生什么”。这是一个完全不同的问题,答案是“没有”。
(所以通常当你有一个包含指针成员的类时,你应该仔细考虑谁拥有可能需要清理的任何资源。)
由于你在问题中提到“析构函数”这个词,让我们一劳永逸地说出来:
指针类型对象没有析构函数。当指针超出范围时,不会自动调用
delete
。
答案 1 :(得分:0)
销毁原始指针变量是一个无操作(read more)。共享对象仍然可用。
答案 2 :(得分:0)
删除object1时,m_sharedB指向的内存 not 将被释放,因为您没有为类User提供析构函数。这使得包含类(A类)也可以管理共享指针的生命周期,一旦不再存在对它的引用,确保它被正确删除(即,共享相同共享指针的所有用户实例都是死)。
答案 3 :(得分:0)
当删除object1时,成员变量" m_sharedB"会发生什么?
删除object1时,不会对指针pB进行任何操作。但是变量m_shared被破坏了。 另外我想建议你使用来自boost库的智能指针。特别是shared_ptr
答案 4 :(得分:0)
听起来您的问题已得到解答,但我只想提及boost::shared_ptr。这可能无法满足您当前的需求,但它是您在上面描述的有用情况。