【问题标题】:Aggregation using vector使用向量聚合
【发布时间】:2012-02-08 21:25:41
【问题描述】:

我想创建一个聚合并用向量存储对象,我写的正确吗? :

 Class A
{
  private:
           vector <B *> pB;
  public:
           A();
           A(int tag);
           ~A();
  }

  A::A(int tag){
     for (i=0; i != tag, i++)
     pB.push_back(new B());
  }

要创建不是聚合而是组合,我只需在析构函数中添加它:

A::~A(){
       vector <B *>::iterator citer = pB.begin();
        while (citer != pB.end())
        delete *(citer++);
        pB.clear();
 }

对吗? 谢谢

【问题讨论】:

  • 为什么不直接使用std::vector&lt;B&gt;
  • 你还在用 pB 做什么(我怀疑没有任何用法会使这成为正确的方法,但我认为我们需要了解更多信息才能提出最佳方法)
  • 您可能想要查看shared_ptrunique_ptrboost ptr_containers,而不是将原始指针存储在不管理它们的容器中。
  • @KennyTM:将 A 的生命与 B 的生命分开
  • @Mark:B 与 A 是有关系的,所以我创建了一个聚合。 pB 包含一个指向包含大型稀疏矩阵的对象的指针。 A 类管理这些矩阵。

标签: c++ vector composition aggregation


【解决方案1】:

您缺少访问指针的方法,例如

B* getPtr(int iP) {
    if(iP<pB.size()) {
        return pB.at(iP);
    }
    return NULL
}

并删除列表的单个指针:

void delPtr(int iP) {
    if(iP<pB.size()) {
       delete pB.at(iP);
       pB.erase(pB.begin()+iP);
    }
 }

【讨论】:

  • 好的,非常感谢。以这种方式,我应该从外部 C 类管理 pB 的生命周期,以避免内存泄漏。如果是这样,我想问题已经解决了
【解决方案2】:

我认为在您的 aggregation 情况下,您应该有一种方法将对象添加到向量,而不是在构造函数中执行。

然后A 类的用户必须正确管理对象的生命周期。

现在您的 aggregation 代码不正确。你有明显的内存泄漏。

【讨论】:

  • 用户构建A(int tag)时对象的个数是固定的,tag是对象的个数。但我理解我的错误。
  • 嗯,在我的理解中,聚合是当你的对象包含其他一些但没有它们时可以生存,而合成是当它不能时。简单来说,如果您在构造函数中创建对象并且以后无法删除它们,那么您的 A 就不能没有对象。
  • 是的,我认为你是对的,现在我在聚合的情况下出现了内存泄漏。添加一个函数 getpB() 来获取B的对象的地址应该是正确的解决方案,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-23
  • 2019-06-18
  • 2017-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多