[英]Passing raw pointer to a function with shared_ptr
当我有一个功能:
void foo(std::shared_ptr<T> a, std::shared_ptr<T> b);
这样调用时是否有内存泄漏的可能:
foo(new T(), new T());
由于向shared_ptr
的转换是显式的,因此无法编译。 如果我要天真地解决这个问题:
foo(std::shared_ptr<T>(new T()), std::shared_ptr<T>(new T())); // don't do this
那么确实有可能发生内存泄漏。 允许的评估顺序为:
T * p1 = new T();
T * p2 = new T();
std::shared_ptr<T> s1(p1);
std::shared_ptr<T> s2(p2);
foo(s1,s2);
如果第二个new
抛出异常,则第一个对象将被泄漏。 要解决此问题,请在尝试使用临时变量进行第二次分配之前,确保第一个共享指针已初始化:
std::shared_ptr<T> a(new T());
std::shared_ptr<T> b(new T());
foo(a,b);
或调用一个函数来初始化每个
foo(std::make_shared<T>(), std::make_shared<T>());
正如@Mike所说,您的源代码不会编译。 您需要显式构造shared_ptr
,例如:
foo(std::shared_ptr<T>(new T()), std::shared_ptr<T>(new T()));
还是不安全的。 在c ++表达式中,用作函数参数的表达式通常可以按任何顺序进行求值,包括插入,除非受其他规则限制。
例如,顺序可能是:
如果步骤(3)或(4)失败(通过抛出),则不会破坏在步骤(2)构造的对象,并且在步骤(1)分配的内存将泄漏。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.