如何正确地将对象添加到向量,而无需两次调用析构函数

How to add objects to vectors correctly, without calling destructor two times

本文关键字:析构函数 调用 两次 正确地 对象 添加 向量      更新时间:2023-10-16

我正在尝试在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 在 ptrpush_back 之间的符号 -> 处抛出错误,说"没有过载函数实例"。

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

如何正确地将对象添加到向量,而无需两次调用析构函数

emplace_back

ptr->emplace_back(name);

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

这应该不会给行为良好的类带来错误。如果调用push_back给您带来了问题,则暗示Client类有问题。确保它是正确可复制和可分配的。

问题是你的误解

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

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

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