您的位置:首页 > 编程语言 > C语言/C++

C++11-智能指针和空指针

2017-03-29 21:36 204 查看
nullptr
空指针是不会指向有效数据的指针,以前用0表示,但是这使得0既可表示指针常量,又可表示整型常量。C++11仍允许使用0来表示空指针,因此表达式nullptr==0为true,使用nullptr表示空指针而不是0提供了更高的类型安全。

智能指针
如果指针ps有一个析构函数,该析构函数将在ps过期时释放它指向的内存。因此,问题在于它只是一个常规指针,不是有析构函数的类对象。如果它是对象,则可以在对象过期时,让它的析构函数删除指向的内存。
 
头文件memory
std::shared_ptr<string> ps(newstring);
std::shared_ptr<string> ps(newstring("a"));
所有的智能指针类都有一个explicit构造函数
关键字:C++中,
一个参数的构造函数(或者除了第一个参数外其余参数都有默认值的多参构造函数),
承担了两个角色。 1是个构造器,2是个默认且隐含的类型转换操作符。在某些情况下(见下面权威的例子),却违背了我们(程序员)的本意。
这时候就要在这个构造器前面加上explicit修饰, 指定这个构造器只能被明确的调用/使用,
不能作为类型转换操作符被隐含的使用。

 


避免两个指针指向同一个对象,防止多次删除。可以:
1、定义赋值运算符,使之执行深复制,这样两个指针将指向不同的对象。
2、建立所有权概念,对于特定的对象,只能有一个智能指针可以拥有它,这样只有拥有对象的智能指针的构造函数会删除该对象。
3、创建智能更高的指针,跟踪引用特定对象的智能指针数,称为引用计数,赋值时,计数加1,指针过期时,计数减1,仅当最后一个指针过期时,才调用delete。
 
auto_ptr<string>p1(new string("a"));
auto_ptr<string>p2;
p2 =p1;
在语句3里面,p2接管string对象的所有权后,p1的所有权将被剥夺,好处是防止p1和p2的析构函数试图删除同一个对象,但是p1如果再使用的话就很危险。悬挂指针。
 
unique_ptr<string>p1(new string("a"));
unique_ptr<string>p2;
p2 =p1;
这里的语句3非法,避免了p1不再指向有效数据的问题,因此unique_ptr比auto_ptr更安全(编译阶段错误比潜在的程序崩溃更安全)。
 
unique_ptr<string>demo(const char *s) {
   unique_ptr<string> temp(newstring(s));
   return temp;
}
unique_ptr<string>ps;
ps =demo("a");
如果unique_ptr是个临时右值,编译器允许这样做,如果源unique_ptr将存在一段时间,编译器将禁止这样做。
 
C++11中有一个标准库函数std::move(),移动构造函数和右值引用。
ps2 =move(ps1);
 
相比于auto_ptr,unique_ptr还有另一个优点,它有一个可用于数组的变体
std::unique_ptr<double[]>pda(new double(5));
不过必须使用delete[]来删除。
 
如果程序要使用多个指向同一个对象的指针,应选择shared_ptr。能用auto_ptr时,更好选择unique_ptr。BOOST库提供的scoped_ptr与unique_ptr类似。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息