【发布时间】:2016-07-27 08:13:41
【问题描述】:
我知道:
#include <memory>
class A;
class B
{
public:
B(A* a) : a_(a) {}
private:
std::auto_ptr<A> a_;
};
与未定义的行为发生冲突,除非您的 B::~B() 定义越界;
在某一时刻,gcc 曾经这样说:
blah/auto_ptr.h: 在析构函数'std::auto_ptr<_tp>::~auto_ptr() [with _Tp = B]': test.hh:6: 从这里实例化
blah/auto_ptr.h:173:注意:无论是析构函数还是特定于类的操作符 delete 都不会被调用,即使它们是在定义类时声明的。
我们可以检测到这一点并在任何不好的事情发生之前修复代码。有时这停止发生。是否有任何编译器选项可以打开它(-Wall -Wextra -Wpedantic 似乎没有削减它)
注意:由于各种原因,不能迁移到 C++11 和 unique_ptr,据我阅读,unique_ptr 也存在同样的问题。
【问题讨论】:
-
std::auto_ptr的设计存在根本缺陷。即使您无法迁移到 C++11 或更高版本,您也应该考虑放弃auto_ptr以支持替代解决方案。它是如此的有缺陷,以至于该类型将从 C++17 的标准库中完全删除。
标签: c++ gcc-warning