通过C ++中的指针在对象之间共享数据

时间:2011-06-21 21:42:16

标签: c++ constructor destructor shared-ptr

我有几个通过指针共享数据的对象。指针参数是在构造函数中发送的,如下所示。

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”会发生什么?是否存在悬挂指针给其他同行的问题?

5 个答案:

答案 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。这可能无法满足您当前的需求,但它是您在上面描述的有用情况。