当类没有析构函数时,智能指针或作用域指针是否会删除对象 如果没有,为什么不离开范围并让对象自行删除?
答案 0 :(得分:2)
即使在删除实例时没有析构函数,也会删除所有类成员。处理指针时会发生内存泄漏:
class A
{
private:
B* b;
};
在这种情况下,当b
的实例被删除时,A
本身将被销毁,但它指向的内存将不会被销毁。
class A
{
private:
SmartPtr<B> b;
};
对于智能指针,它通常在析构函数中有一些引用计数和内存清理,它指向的内存将被析构函数显式销毁,并且当实例时将隐式调用智能指针的析构函数包含类的内容被销毁。
答案 1 :(得分:0)
是的,智能指针删除对象而不管类是否具有析构函数。请注意,智能指针与堆上分配的对象一起使用(使用new
),这些对象在超出范围时不会释放内存,您需要明确delete
它们。智能指针将删除显式删除它们的过程。
答案 2 :(得分:0)
将删除指向对象本身的指针。但是,如果类中有任何动态分配的数据,它将不会被释放。拥有析构函数的想法是能够对类对象进行后处理,主要是 - 释放所有资源。
答案 3 :(得分:0)
是肯定的。这是什么智能指针用于。 http://www.boost.org/doc/libs/1_48_0/libs/smart_ptr/smart_ptr.htm
答案 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
它释放了最终析构函数中的锁。我也用过聪明的东西
一两个案例中的指针,以确保事务语义:在一个
例如,对象在许多不同的集合中(其中
当然,他们指着他们,根据不同的命令
标准。要修改对象,您获取了一个共享指针;该
返回此共享指针的函数也删除了对象
从集合中,以便您也可以安全地修改键值,
然后最终的析构函数将它们重新插入到集合中
新钥匙。等等 - 智能有许多用途
与内存管理或对象无关的指针
寿命。