当类没有析构函数时,智能指针或作用域指针是否会删除对象

时间:2012-02-24 07:28:05

标签: c++ smart-pointers

当类没有析构函数时,智能指针或作用域指针是否会删除对象 如果没有,为什么不离开范围并让对象自行删除?

6 个答案:

答案 0 :(得分:2)

即使在删除实例时没有析构函数,也会删除所有类成员。处理指针时会发生内存泄漏:

class A
{
private:
   B* b;
};

在这种情况下,当b的实例被删除时,A本身将被销毁,但它指向的内存将不会被销毁。

class A
{
private:
   SmartPtr<B> b;
};

对于智能指针,它通常在析构函数中有一些引用计数和内存清理,它指向的内存将被析构函数显式销毁,并且当实例时将隐式调用智能指针的析构函数包含类的内容被销毁。

答案 1 :(得分:0)

是的,智能指针删除对象而不管类是否具有析构函数。请注意,智能指针与堆上分配的对象一起使用(使用new),这些对象在超出范围时不会释放内存,您需要明确delete它们。智能指针将删除显式删除它们的过程。

答案 2 :(得分:0)

将删除指向对象本身的指针。但是,如果类中有任何动态分配的数据,它将不会被释放。拥有析构函数的想法是能够对类对象进行后处理,主要是 - 释放所有资源。

答案 3 :(得分:0)

答案 4 :(得分:0)

new和delete做两件事。

new分配内存并获取一个对象来在该内存空间中构造自己。 delete首先获取对象以自毁,然后释放内存。

请注意,某些智能指针可以被赋予一个自定义删除器,它不会在对象上调用delete,而是要求它执行任何操作。在某些情况下,您可能希望通过无操作。

答案 5 :(得分:0)

你的观点很好;智能指针的用途并不多 在C ++中,从大多数时候它们可能是相关的,你就是 最好使用价值语义和复制。如果是 scoped_ptr,最常用的是实际对象 多态性:

scoped_ptr<Base> pObj = condition 
                        ? static_cast<Base*>( new Derived1 )
                        : static_cast<Base*>( new Derived2 );

(遗憾的是,static_cast中至少有一个是必要的。)

如果您正在处理多态对象的容器,则需要 shared_ptr而是,如果你要返回一个多态对象,或者 否则传递它,如果可以,你将使用unique_ptr 保证其可用性,在某些情况下保证auto_ptr 在你传递它的地方,shared_ptr可能更合适。

在返回对象或传递它的情况下,成本 复制它也可能是使用智能指针的动机,即使是 对象不是多态的。在这种情况下,我仍然使用值语义 (即复制和分配对象本身)除非我有一个 性能问题。

请注意,智能指针不仅用于内存管理。一世 在线程之间的队列接口中定期使用auto_ptr: 一旦将对象插入队列,它就不再属于 到发送线程; auto_ptr完全表达了这些语义, 发送线程中的auto_ptr变为无效。或者a 可修改的单身人士(这应该是非常非常罕见的)可能 获取其instance函数中的锁定,并返回shared_ptr 它释放了最终析构函数中的锁。我也用过聪明的东西 一两个案例中的指针,以确保事务语义:在一个 例如,对象在许多不同的集合中(其中 当然,他们指着他们,根据不同的命令 标准。要修改对象,您获取了一个共享指针;该 返回此共享指针的函数也删除了对象 从集合中,以便您也可以安全地修改键值, 然后最终的析构函数将它们重新插入到集合中 新钥匙。等等 - 智能有许多用途 与内存管理或对象无关的指针 寿命。