【发布时间】:2017-10-10 10:22:08
【问题描述】:
动态分析在我们的代码库中发现了奇怪的内存泄漏。有问题的代码如下所示:
Something *p = new Something(getArgument());
函数getArgument() 有时会抛出的地方。当它抛出时,新分配的对象被泄露。这是由 Visual Studio 2015 (MSC++ 19.0) 编译的。
现在,当我检查规范 (C++14 final draft) 时,第 5.3.4/8 条奇怪地说:
new-expression 可以通过调用 分配函数 (3.7.4.1) 来获取对象的存储空间。如果 new-expression 通过抛出异常终止,它可能通过调用释放函数释放存储 (3.7.4.2)。如果分配的类型是非数组类型,分配函数的名称是
operator new和 释放函数的名称是operator delete。如果分配的类型是数组类型,分配 函数名称为operator new[],释放函数名称为operator delete[]。
这里使用“可能”(我在上面突出显示)意味着编译器可以不这样做。
是这样的:
- 在规范的其他地方按要求说明,使其成为 Visual C++ 编译器中的一个错误(仅在某些情况下可能发生;没有检查它的一般性),
- 规范中的错误,或
- 出于某种原因这样写?
注意:当表达式完成时,代码会正确删除对象。没有错误。严格来说,问题在于 new-expression 抛出时会发生什么。
【问题讨论】:
-
阅读该部分的后续段落。在某些情况下(例如第 10 段),调用分配函数不需要 new 表达式,在这种情况下需要什么。
-
@Peter,嗯,你是对的。
标签: c++ visual-c++ memory-leaks exception-handling language-lawyer