c++ - 创建 shared_ptr 时类析构函数调用两次

标签 c++

当我为我的类创建共享 ptr 时,类析构函数被调用两次时遇到问题。

我正在尝试创建一个对象 vector ,每个对象都有一个构造函数和一个析构函数。

当我打电话时:

std::vector<std::shared_ptr<ServoController>>  servos;
bool CreateServo(int id)
{
    std::shared_ptr<ServoController> servo = std::make_shared<ServoController>(ServoController(id));
    servos.push_back(servo);
}

调用 ServoController 的构造函数,然后立即调用 ServoController 的析构函数,甚至在调用 push_back 函数之前。

然后,当我关闭我的应用程序时,再次调用 ServoController 的析构函数。但是到目前为止,构造函数只被调用过一次(我在 vector 中只有 1 个对象)。至少它不应该让构造函数再次运行吗?

有什么方法可以创建我的类的 vector ,并且对于 vector 中的每个对象,构造函数应该被调用一次,当对象从 vector 中移除或者 vector 被删除时,析构函数应该被调用一次毁了?

谢谢, -D

最佳答案

您正在使用此调用创建一个临时对象,这是导致第一次(意外)析构函数调用的原因。

std::make_shared<ServoController>(ServoController(id));

事件的顺序是:

  • ServoController(id)创建一个新的临时对象,作为参数传递给 std::make_shared .
  • std::make_shared<ServoController>然后将临时对象转发到 ServoController复制构造函数(这可能不是您想要的)。这就是为什么您的主构造函数只被调用一次的原因。
  • 这会在堆上创建一个新对象(由 shared_ptr 管理),它是您创建的临时对象的拷贝。
  • 然后立即销毁临时对象,这就是第一次调用析构函数。

你真正想要的是:

std::make_shared<ServoController>(id);

std::make_shared将其参数直接转发给其模板参数的构造函数。您不需要在那里进行额外的构造函数调用。

关于c++ - 创建 shared_ptr 时类析构函数调用两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41559647/

相关文章:

c++ - 按键删除 STL std::set 元素时出现编译错误

c++ - VS C++ 编译器使用哪些不同的处理器寄存器?

c++ - 机器相关的_write失败,错误代码为EINVAL

c++ - STL Map - 显示 find() 函数指向的内容

c++ - 在模板派生类中继承具有类型别名的构造函数

c++ - 使用 find 解析文件会给出不同文件的奇怪结果

c++ - 如果在 TreeView Qt 中按下按钮,则重命名文件

c++ - 为什么 long 在查找三个整数的第二大时显示错误输出?

c++ - 在VS2010 Debug模式下启用多核编译?

c++ - vector 构造函数中的函数匹配