c++ - 在什么平台上 func(shared_ptr(...), shared_ptr(...)) 真的很危险?

标签 c++ constructor shared-ptr operator-precedence

我记得 Scott Meyers 教我的

func(shared_ptr(new P), shared_ptr(new Q));

是危险的,因为(如果我没记错的话)内存分配引用计数(构造)和分配给 顺序>函数参数 允许leak (理论上?)在极少数情况下出现。为了防止这种情况应该将 shared_ptr 封装在函数调用中,例如在 make_shared() 中。

func(make_shared<P>(), make_shared<Q>());

这是一些 discussion关于它。

我想知道是否有(当前)编译器在该领域,在某些系统上确实可能在某些错误情况下留下一些漏洞?还是那些时代已经过去了,或者它们只是理论上的?

最有趣的是知道其中是否存在该问题:

  • g++ 4.x 或 g++ 2.95,在 Linux i386、x64、ARM、m68k 或任何 Windows 上
  • i368、x64 或 ARM 上的 Visual C++
  • Linux 或其任何平台上的 Clang/LLVM
  • Sun 或 IBM、HP-UX 上/来自 Sun 或 IBM 的 C++ 编译器怎么样?

有没有人在他的特定平台上观察到这种行为?

最佳答案

这不是平台问题,而是异常安全问题。因此,您实际问题的答案是:所有这些平台都可能出现该问题。

内存泄漏问题是由两件事引起的:

  • 使用 new 分配内存可能会抛出 bad_alloc
  • 函数参数的计算顺序未指定。

boost::shared_ptr 的文档很好地捕获了它 here

一般问题有更详细的处理here (GOTW)

它可能“罕见”的原因是因为获得 bad_alloc 实际上并不常见,但如果要避免内存泄漏,您的代码必须安全地处理这种可能性。

(我说“可能”展示它 - 我没有检查如果 new 失败,它们是否都抛出 bad_alloc...)

关于c++ - 在什么平台上 func(shared_ptr(...), shared_ptr(...)) 真的很危险?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18075152/

相关文章:

C++:将外部库链接到 dll 库

c++ - winsock 选择函数出现堆栈溢出异常 (0xC00000FD)

c++ - 写入实际的数据包数据,pcap

c++ - 构造虚拟基类时的编译器行为

constructor - 如何在 init 方法之前将函数应用于数据类构造函数中定义的值?

c++ - cv::Mat 或 CvMat* 中的大数据

python - 自动生成的 Python 构造函数

c++ - 如果继承不是公开的而不是出错,为什么 enable_shared_from_this 会崩溃

c++ - 将 std::shared_ptr 隐式转换为类型

在 boost::shared_ptr operator bool() 上旋转时需要 C++ volatile?