社区
C语言
帖子详情
谁能讲讲智能指针是什么啊?
dsdc
2003-10-09 11:22:44
如题
...全文
112
7
打赏
收藏
谁能讲讲智能指针是什么啊?
如题
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
7 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
Wolf0403
2003-10-09
打赏
举报
回复
智能指针最大的好处:异常安全
譬如这样:
A* pA = new A;
f();
//...
delete pA;
这个代码一般工作正常,但是如果万一 f() 抛出一个异常,没有被捕捉,在没有 __finally 扩展关键字的情况下, delete pA; 是用于无法执行到的。如果用
auto_ptr<A> a = auto_ptr<A>(new A);
代替,则异常抛出后清理堆栈的时候 a 会被自动析构,同时释放它指向的 A* 内存。
panzhaoping
2003-10-09
打赏
举报
回复
up
aflyinghorse
2003-10-09
打赏
举报
回复
more effective c++中讲的很详细,可以参考一下
jyc_nj
2003-10-09
打赏
举报
回复
指针使用时有一些要注意的地方:有new就要delete,对COM指针,要AddRef和Release, 即这些动作要成对出现,而往往大家会在这方面犯错, 应运而生的智能指针就是为了解决这个问题,首先把指针变量作为成员变量封装起来,在智能指针类对象离开作用域时,就会在析构的过程完成指针的释放.此外,智能指针类重载了如&,*之类的运算符,所以,用起来感觉和用一般指针一样.
不过,使用智能指针类会产生开销增大,和因为太多行为是隐式调用相反造成混乱的问题.
关键是用的时候要有良好的习惯,如当混乱使用指针和智能指针时要格外小心等等.
darcymei
2003-10-09
打赏
举报
回复
我们也可以为类类型的对象重载成员访问操作符箭头它必须被定义为一个类的成员函
数它的作用是赋予一个类类型与指针类似的行为它通常被用于一个代表智能指针smart
pointer 的类类型也就是说一个类的行为很像内置的指针类型但是支持某些额外的
功能
例如假设我们想定义一个类类型来代表一个指向Screen 类对象的指针这里的Screen
类是第13 章介绍的定义如下
class ScreenPtr {
// ...
private:
Screen *ptr;
};
我们希望定义ScreenPtr 类来保证这种类的对象总是指向Screen 对象它不能不指向
对象如同内置指针一样我们的应用程序可以直接使用ScreenPtr 类型的对象而不用先测
试它是否指向一个Screen 对象为了获得这种行为我们定义一个带有构造函数的ScreenPtr
类但是它没有缺省构造函数关于构造函数在14.2 节详细讨论
class ScreenPtr {
public:
ScreenPtr( Screen &s ) : ptr( &s ) { }
//....
};
ScreenPtr 类型的对象的定义必须提供初始值一个Screen 类型的对象ScreenPtr 对象
将指向它否则ScreenPtr 对象的定义就是错误的
ScreenPtr p1; // 错误: ScreenPtr 没有缺省构造函数
Screen myScreen( 4, 4 );
ScreenPtr ps( myScreen ); // ok
为使ScreenPtr 类的行为像内置指针我们必须再定义一些重载操作符我们定义的两个
操作符是解引用操作符* 和成员操作符箭头->
// 支持指针行为的重载操作符
class ScreenPtr {
public:
Screen& operator*() { return *ptr; }
Screen* operator->() { return ptr; }
//....
};
成员访问操作符箭头被重载为一元操作符即它没有参数当它被用在表达式中时只
能根据左边操作数的类型来选择它例如下面给出的语句
point->action();
将检查point 以决定其类型如果point 是某一个类类型的指针则这个语句使用内置成
员访问操作符箭头的语义如果point 是某一个类类型的对象或引用则查找这个类的重载
的成员操作符箭头如果没有定义成员操作符则该语句就是错的因为类对象或引用通常
必须使用点成员访问操作符来引用类成员如果定义了重载的成员访问操作符箭头则它被
绑定到point 上并被调用
重载的成员访问操作符箭头的返回类型必须是一个类类型的指针或者是定义该成员
访问操作符箭头的类的一个对象如果返回类型是一个类类型的指针则内置成员访问操
作符箭头的语义被应用在返回值上如果返回值是另外一个类的对象或引用则递归应用该
过程直到返回的是指针类型或语句错误例如我们可以用ScreenPtr 对象ps 访问Screen
类的成员如下所示
ps->move( 2, 3 );
因为成员访问操作符箭头的左操作数的类型是ScreenPtr 所以使用该类的重载操作符
该操作符返回一个指向Screen 类对象的指针内置成员访问操作符箭头被依次应用在这个返
回值上以调用Screen 类的成员函数move()
下面的小程序使用了我们的ScreenPtr 类ScreenPtr 类型的对象用起来就像Screen*类型
的对象一样
#include <iostream>
#include <string>
#include "Screen.h"
void printScreen( ScreenPtr &ps )
{
cout << "Screen Object ("
<< ps->height() << ", "
<< ps->width() << " )\n\n";
for ( int ix = 1; ix <= ps ->height(); ++ix )
{
for ( int iy = 1; iy <= ps ->width(); ++iy )
cout << ps->get( ix, iy );
cout << "\n";
}
}
int main() {
Screen sobj( 2, 5 );
string iint( "HelloWorld" );
ScreenPtr ps( sobj );
// 设置屏幕的内容
string::size_type iintpos = 0;
for ( int ix = 1; ix <= ps->height(); ++ix )
for ( int iy = 1; iy <= ps ->width(); ++iy )
{
ps->move( ix, iy );
ps->set( iint[ iintpos++ ] );
}
// 输出屏幕的内容
printScreen( ps );
return 0;
}
当然这种操纵类对象的指针不像使用内置指针类型一样有效率所以智能指针类必
须提供其他一些对于我们的程序设计很重要的功能
c++primer上的,自己看看吧
leyt
2003-10-09
打赏
举报
回复
up
Wolf0403
2003-10-09
打赏
举报
回复
最简单的智能指针示例:
template <typename _Ty>
class Ptr
{
public:
explicit Ptr(_Ty* _p){assert(_p); m_p = _p;}
~Ptr(){delete _p;}
_Ty* operator->(){return m_p;}
_Ty& operator*() {return *m_p;}
};
完整的参考 <memory> 中的 auto_ptr 代码,Dev-C++/VC7.1 的版本都很清晰易懂,实现良好,全部是 throw() 的^_^
2小时精通C++
智能指针
本课程讲解C++11标准库中的
智能指针
。 对于C/C++程序员来说,指针是天堂,也是地狱。指针用得好程序运行效率倍增,用得不好问题层出不穷。
智能指针
可以解决普通指针存在的悬垂指针、野指针、资源泄露等问题 本教程...
C++ 11 14 17 20内存管理-指针、
智能指针
和内存池
课程简介 C++ 11 14 17 20内存管理-指针、
智能指针
和内存池从基础到实战 学习计划 1. 每天学习一小时以上 2. 跟着视频动手编写代码 3. 调试代码并对比课程多提供的源码 课程目标 1. 理解指针...
精通C语言指针
指针被誉为C语言的精髓、C本质上是加了一层语法糖的汇编,引进当时先进的函数,保留了汇编强大的地址直接访问功能 —— 指针,使其高效灵活。本课程是黄强老师对于指针的一次专题讲解,相信能给大家带来收获!
朱老师C++课程第3部分-3.6
智能指针
与STL查漏补缺
《朱老师带你学C++》属于系列课程《朱有鹏老师热门编程语言全解》的第一部分,主要针对C++语言学习。本课程可以看做是嵌入式linux核心课程中《C语言专题》课程的延续,在学好了C语言前提下继续深度学习C++语言。...
C语言嵌入式Linux编程第6期:数据存储与指针
本期课程为《C语言嵌入式Linux编程》第6期,从一个全新的视角:存储的角度,由浅入深,层层递进,一步一步去探讨讲解C指针。...通过本期课程学习,达到“能用指针、敢用指针、善用指针”之学习目的。
C语言
69,366
社区成员
243,081
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章