我是c ++和智能指针的新手。 我有这样的代码。
Example* Example::get_instance() {
Example* example = new Example();
return example;
}
我正在尝试将其转换为像这样的智能指针
shared_ptr<Example> Example::get_instance() {
shared_ptr<Example> example (new Example());
return example;
}
这是正确的方法,因为当我试图从另一个类调用它时它不工作。我正在尝试实现一个单例对象。
答案 0 :(得分:1)
每次请求对象时,您都在创建一个新的Example
对象,这是一个内存泄漏,您每次都返回一个不同的对象。试试这个:
Example & Example::get_instance() {
static Example example;
return example;
}
另请注意以下有关您的代码的建议:
创建智能指针时,请选择make_shared
而不是shared_ptr<YourType>(new YourType(...))
。可以找到原因here。相关摘录:
此函数通常为T对象和for分配内存 shared_ptr的控制块具有单个内存分配(它是一个 标准中的非约束性要求)。相反,声明 std :: shared_ptr p(new T(Args ...))执行至少两个内存 分配,可能会产生不必要的开销。此外, f(shared_ptr(new int(42)),g())如果g,可能导致内存泄漏 抛出一个例外。如果make_shared是,则不存在此问题 使用
了解std::unique_ptr
和std::shared_ptr
之间的区别。对于你的情况,std::unique_ptr
本来会更好,但是你的问题有一个更简单的解决方案,我已在上面展示过。
一般来说,当你可以使用引用时避免指针,它们更容易使用,代码看起来更清晰。
尽量避免使用单例,稍后您可能会发现使用单例的代码最终可能需要处理Example
对象的多个实例,而不是调用Example :: get_instance而只能处理单个实例。因此,当你有了这个启示时,(并且可能只是时间问题),你将面临重大的重构。
所以,“小心,有龙!”。