当前位置:  开发笔记 > 编程语言 > 正文

创建shared_ptr时,类析构函数被调用两次

如何解决《创建shared_ptr时,类析构函数被调用两次》经验,为你挑选了1个好方法。

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

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

当我打电话时,例如:

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

调用ServoController的构造函数,然后立即调用Destructor for ServoController,之后甚至调用push_back函数.

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

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

感谢:D



1> Chris Vig..:

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

std::make_shared(ServoController(id));

事件的顺序是:

ServoController(id)创建一个新的临时对象,作为参数传递给std::make_shared.

std::make_shared随后转发该临时对象ServoController拷贝构造函数(这可能不是你想要的).这就是为什么你的主构造函数只被调用一次.

这将在堆上创建一个新对象(由其管理shared_ptr),它是您创建的临时对象的副本.

然后立即销毁临时对象,这是第一次调用析构函数.

你真正想要的是:

std::make_shared(id);

std::make_shared将其参数直接转发给其模板参数的构造函数.你不需要额外的构造函数调用.

推荐阅读
虎仔球妈_459
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有