当类没有析构函数时,智能指针或作用域指针会删除对象吗如果不是,为什么不离开作用域,让对象自己删除呢?
删除实例时,即使没有析构函数,也会删除所有类成员。处理指针时会发生内存泄漏:
class A
{
private:
B* b;
};
在这种情况下,当A
的实例被删除时,b
本身将被销毁,但它所指向的内存不会被销毁。
class A
{
private:
SmartPtr<B> b;
};
在智能指针的情况下,通常在析构函数中有一些引用计数和内存清理,它所指向的内存将被其析构函数显式销毁,并且当包含类的实例被销毁时,智能指针的析构函数将被隐式调用。
是。这就是智能指针的用途。http://www.boost.org/doc/libs/1_48_0/libs/smart_ptr/smart_ptr.htm
http://en.wikipedia.org/wiki/Smart_pointer
什么是智能指针?我什么时候应该使用智能指针?
是的,无论类是否具有析构函数,智能指针都会删除对象。请注意,智能指针用于堆上分配的对象(使用new
),当它们超出范围时,这些对象不会释放内存,您需要显式地使用delete
。智能指针将删除显式删除它们的过程。
指向对象本身的指针将被删除。但是,如果类中有任何动态分配的数据,它将不会被释放。拥有析构函数的想法是能够对类对象进行后处理,并主要释放所占用的任何资源。
new和delete做两件事。
new
分配内存并获取一个对象以在该内存空间中构造自己。delete
首先让对象自毁,然后释放内存。
请注意,一些智能指针可以提供一个自定义的deleter,它不会对对象调用delete,而是调用你要求它做的任何事情。有时你可能希望给它一个no-op。
你的观点得到了很好的理解;智能指针没有那么多用途在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
:一旦对象被插入队列,它就不再属于发送线程;CCD_ 14准确地表达了这些语义,其中发送线程中的CCD_ 15变为无效。或者可修改的singleton(应该是非常非常罕见的)可能在其instance
函数中获取锁,并返回shared_ptr
这释放了其最终析构函数中的锁。我也用过智能在一个或两个情况下确保事务语义的指针:在一个例如,在这种情况下,对象位于多个不同的集合中(当然,持有指向它们的指针),根据不同排序标准要修改对象,您获取了一个指向该对象的共享指针;这个返回此共享指针的函数也删除了对象以便您也可以安全地修改键值,最后的析构函数根据新密钥。等等—智能手机有多种用途与内存管理或对象无关的指针一生