如何正确地向对象添加对象,而不需要调用析构函数两次

时间:2013-11-12 17:11:44

标签: c++ pointers vector

我正在尝试在向量中创建现有对象的列表。以下是我到目前为止的情况:

   void Program::addClient(string name){
      vector<Client> *ptr = &(impl->clients);
      Client cl(name);
      ptr->push_back(cl);
   }

问题是析构函数将被调用两次:首先,当方法addClient结束时,第二次,当调用此方法类的析构函数时。因此,我得到一个错误(显然)。所以我想写这样的东西:

   void Program::addCategory(string name){
      vector<Category> *ptr = &(impl->categories);
      Category *c = new Category(name);
      ptr->push_back(c);
   }

通过这样做,我相信,我会摆脱析构函数问题,但还有另一个问题。我的IDE在->ptr之间的符号push_back处抛出错误,说“没有重载功能的实例”。

我应该做什么,也许你有任何提示?

2 个答案:

答案 0 :(得分:1)

  

如何正确地向对象添加对象,而不需要两次调用析构函数

使用emplace_back

ptr->emplace_back(name);
  

问题是析构函数会被调用两次......因此,我得到一个错误(显然)。

这不应该导致行为良好的类出错。如果调用push_back导致您出现问题,则提示Client类有问题。确保它可以正确复制和分配。

答案 1 :(得分:0)

问题是你的误解

  

问题是析构函数将被调用两次:首先,当方法addClient结束时,第二次,当调用此方法类的析构函数时。

以上不是问题。将对象插入std::vector<Client>时,您正在插入副本。析构函数运行两次,因为在复制完成后,有两个对象。

如果这实际上导致您出错,则Client很可能无法正确复制,您需要使其可复制或重新考虑您的使用方式。