因为C++使用内存的时候很容易出现野指针、悬空指针、内存泄露的问题。所以C++11引入了智能指针来管理内存。有四种: auto_ptr:已经不用了 unique_ptr:独占式指针,同一时刻只能有一个指针指向同一个对象 shared_ptr:共享式指针,同一时刻可以有多个指针指向同一个对象 weak_ptr:用来解决shared_ptr相互引用导致的死锁问题...
利用已经存在的智能指针来构造新的智能指针 auto_ptr< string > pstr_auto( new string( "Brontosaurus" ) ); auto_ptr< string > pstr_auto2( pstr_auto ); //利用pstr_auto来构造pstr_auto2 因为一块动态内存只能由一个智能指针独享,所以在拷贝构造或赋值时都会发生拥有权转移的过程。在此拷贝构造过程中...
当我们对智能指针进行赋值时,如ptest2 = ptest,ptest2会接管ptest原来的内存管理权,ptest会变为空指针,如果ptest2原来不为空,则它会释放原来的资源,基于这个原因,应该避免把auto_ptr放到容器中,因为算法对容器操作时,很难避免STL内部对容器实现了赋值传递操作,这样会使容器中很多元素被置为NULL。判断一个智能指针...
...也不要使用get初始化另一个智能指针或为智能指针赋值 智能指针类型定义了一个名为get的函数,它返回一个内置指针,指向智能指针管理的对象。此函数是为了这样一种情况而设计的:我们需要向不能使用智能指针的代码传递一个内置指针。使用get返回的指针的代码不能delete此指针。虽然编译器不会给出错误信息,但将另一...
malloc/free、new/delete、空指针、野指针都更贴合内存管理的范畴,和学没学会指针关系不大。内存管理是...
先不考虑智能指针的情况,当data为普通指针T*时,会根据其指针指向的类型T,new一个对象指针b,并令对象指针指向的对象和data的相同;如果不是,那直接赋值就行。/ 如果是智能指针的话,在这里简化了一下,直接返回指针指向的内容就可以啦。考虑到智能指针指向指针,智能指针指向智能指针,智能指针指向指针的指针等一系列神...
跟void类型”修饰“作用不同,void型指针作为指向抽象数据的指针,它本质上表示一段内存块。如果两个指针类型不同,在进行指针类型赋值时必须进行强制类型转换,看下面的例子: 但是可以将任何指针类型赋值给void类型而无须进行强制类型转换: 当然,如果把void型指针转换成并不是它实际指向的数据类型,其结果是不可预测的。
p = q p和q都是shared_ptr,所保存的指针必须能相互转换。此操作会递减p的引用计数,递增q的引用计数;若p的引用计数变为0,则将其管理的原内存释放 p.unique() 若p.use_count()为1,返回true;否则返回false p.use_count() 返回与p共享对象的智能指针数量;可能很慢,主要用于调试 shared_ptr允许多个指针指向...
建议:C++代码代码中多注意使用智能指针 不要使用野指针 野指针也叫悬挂指针,是指向“垃圾”内存的指针,使用“野指针”会让程序出现不确定的行为。 注意,野指针不是NULL指针, 它比NULL指针更容易犯错,因为它不能通过形如 if (NULL == p)的判断语句来预防,只能我们自己在写代码时多注意。
在operator= 中处理 “自我赋值” 赋值对象时应确保复制 “对象内的所有成员变量” 及 “所有 base class 成分”(调用基类复制构造函数) 以对象管理资源(资源在构造函数获得,在析构函数释放,建议使用智能指针,资源取得时机便是初始化时机(Resource Acquisition Is Initialization,RAII)) 在资源管理类中小心 copying 行...