因为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此指针。虽然编译器不会给出错误信息,但将另一...
int * b; //定义一个指针变量b,用于保存一个地址,这个地址所保存的数据应该是int类型。 第二,是变量就应该可以赋值,指针变量也一样。但一般不会给指针直接赋值一个数值,而是将其他变量的地址赋值给指针,或者其他指针的值赋值给这个指针。 继续上面的例子: b=&a; //把变量a的地址赋值给b。“&”操作是取变...
malloc/free、new/delete、空指针、野指针都更贴合内存管理的范畴,和学没学会指针关系不大。内存管理是...
空指针,是一个特殊的指针值。 空指针保证没有指向任一个对象。通常用宏定义NULL来表示空指针常量,NULL其实是0L,因此很多地方也可以将空指针直接赋值为0,表示一样的效果。(C++中改为使用nullptr)因为NULL很粗暴定义为0后可能会出现一些问题,具体可以看参考中对应的链接。
p = q p和q都是shared_ptr,所保存的指针必须能相互转换。此操作会递减p的引用计数,递增q的引用计数;若p的引用计数变为0,则将其管理的原内存释放 p.unique() 若p.use_count()为1,返回true;否则返回false p.use_count() 返回与p共享对象的智能指针数量;可能很慢,主要用于调试 shared_ptr允许多个指针指向...
跟void类型”修饰“作用不同,void型指针作为指向抽象数据的指针,它本质上表示一段内存块。如果两个指针类型不同,在进行指针类型赋值时必须进行强制类型转换,看下面的例子: 但是可以将任何指针类型赋值给void类型而无须进行强制类型转换: 当然,如果把void型指针转换成并不是它实际指向的数据类型,其结果是不可预测的。
建议:C++代码代码中多注意使用智能指针 不要使用野指针 野指针也叫悬挂指针,是指向“垃圾”内存的指针,使用“野指针”会让程序出现不确定的行为。 注意,野指针不是NULL指针, 它比NULL指针更容易犯错,因为它不能通过形如 if (NULL == p)的判断语句来预防,只能我们自己在写代码时多注意。