繁体   English   中英

使用shared_ptr将原始指针传递给函数

[英]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 ++表达式中,用作函数参数的表达式通常可以按任何顺序进行求值,包括插入,除非受其他规则限制。

例如,顺序可能是:

  1. 为第一个T分配内存
  2. 构造第一个T
  3. 为第二个T分配内存
  4. 构造第二个T
  5. 构造shared_ptr
  6. 构造shared_ptr

如果步骤(3)或(4)失败(通过抛出),则不会破坏在步骤(2)构造的对象,并且在步骤(1)分配的内存将泄漏。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM