用指向派生类的指针初始化auto_ptr是否安全
Is it safe to initialize an auto_ptr with a pointer to a derived class?
假设我有一个基类和一个派生类:
class Base
{
public:
virtual ~Base() {}
virtual void DoSomething() = 0;
};
class Child : public Base
{
public:
virtual void DoSomething()
{
// Do Something
}
};
用指向派生类实例的指针初始化基类类型的std::auto_ptr是否安全?也就是说,一个像这样创建的对象:
std::auto_ptr<Base> myObject(new Derived());
正确地调用派生类的析构函数而不是基类而不泄漏内存?
尽管自C++11问世以来,您不应该再使用std::auto_ptr
;
是的,这是安全的,只要您的基础有虚拟析构函数。
如果没有基础上的虚拟析构函数(如下面提到的Steve Jessop),您将得到未定义的行为,因为派生类的析构函数在销毁时是未知的,因此不会被执行。这是一个危险的问题,因为在许多情况下,它不会被注意到。例如,如果您要在一个继承类中管理某种资源,而该资源本应在析构函数中释放,那么泄漏就会悄无声息地发生。
完全安全。
许多参考文献都可用——请尝试搜索"auto_ptr多态性"。
例如。http://www.devx.com/tips/Tip/14391
只要您的类Base
和std::auto_ptr<Base>
被参数化为具有virtual
析构函数,您就可以用从Base
派生的类初始化std::auto_ptr<Base>
,并且如果std::auto_ptr<Base>
析构函数在Base
的定义可见时被实例化,则它们将被正确地销毁。
相关文章:
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- CLANG 编译器 说:变量"PTR"可能未初始化
- 如何在自定义类中启用'auto loops'?
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- 为共享 ptr 向量实现复制 c'tor?
- 为什么当我为 for(auto& it : myUnorderedMap) {... = std::move(it.second)} 时,我会得到一个 const 引用?
- 字符和整数中 **(ptr+1) 的值差异
- C++:在不中断共享的情况下通过引用传递共享 PTR?
- 为什么结构化绑定不使用"auto&"返回对结构成员的引用,而是返回成员本身
- 擦除许多矢量元素,同时使用'auto'
- 考虑到其他好处,关键字'auto'真的有助于简化调试C++吗?
- 为什么"weak.lock()"返回"nullptr" "auto weak=std::make_shared<int>(42);"的定义?
- 推理类型如何工作"auto"和按引用调用?
- 如何将派生类从基 ptr 分配给 nlohmann::json
- 引用 std::shared:ptr 以避免引用计数
- 'auto *x = new some_struct{};"是一个未初始化的变量?
- 为什么 std::gcd/lcm 返回 std::common_type_t<M, N> 而不是 auto?
- 将函数参数类型声明为 auto