类析构函数在创建shared_ptr时调用两次
Class destructor called twice when creating a shared_ptr
当我为我的类创建共享 ptr 时,类析构函数被调用两次时遇到了问题。
我正在尝试创建一个对象向量,每个对象都有一个构造函数和一个析构函数。
当我打电话时,例如:
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 的析构函数。但是到目前为止,构造函数只被调用过一次(向量中只有 1 个对象)。至少它不应该让构造函数再次运行吗?
有什么方法可以制作我的类的向量,对于向量中的每个对象,构造函数应该调用一次,当对象从向量中删除或向量被销毁时,应该调用一次析构函数?
谢谢-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
将其参数直接转发到其模板参数的构造函数。你不需要那里额外的构造函数调用。
相关文章:
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- C++析构函数调用两次,堆栈分配的复合对象
- 对于优化级别为 0 的 std::vector,析构函数被调用两次
- 为什么这个自定义分配器的析构函数在 GCC/MSVS 的 stdlib 中被调用两次
- 重载运算符 new(),为什么构造函数被调用两次?
- 当 reset() 被unique_ptr调用两次时会发生什么?
- CEdit 框的NM_KILLFOCUS被调用两次
- 为什么这个构造函数被调用两次
- 析构函数在与 STL 的共享指针中调用两次
- 构造函数在不同线程中的静态单例类上调用两次
- 类析构函数在创建shared_ptr时调用两次
- 为什么在 C++ 中,当对象包含在另一个对象中时,复制构造函数被调用两次
- makefile 需要调用两次
- [c++]为什么我的类析构函数被调用两次?
- 为什么这个程序中的析构函数被调用两次
- 显式调用析构函数时被调用两次
- C++11 std::generate 和 std::uniform_real_distribution 调用两次会产生
- 基类函数被调用两次
- 为什么析构函数被调用两次,而构造函数只被调用一次
- 为什么函子的 dtor 在作为函数的参数传递给线程时调用两次(多次)