读书人

智能指针类的使用有关问题

发布时间: 2013-07-01 12:33:04 作者: rapoo

智能指针类的使用问题
智能指针的定义如下:

class U_Ptr
{
friend class HasPtr;
int *ip;
size_t use;
U_Ptr( int *p ): ip( p ), use( 1 ) { }
~U_Ptr()
{
delete ip;
}
};

class HasPtr
{
public:
HasPtr( int *p, int i ): ptr( new U_Ptr( p ) ), val( i ) { }
HasPtr( const HasPtr &orig ): ptr( orig.ptr ), val( orig.val )
{
++ptr->use;
}
~HasPtr()
{
if ( --ptr->use == 0 )
delete ptr;
}
private:
U_Ptr *ptr;
int val;
};

下面是主函数,其中第二条语句为什么出错?二次释放空间吗?
int main()
{
int obj = 0;
HasPtr ptr1( &obj, 42 );// 运行时错误???为什么??
return 0;
}
智能指针 类
[解决办法]
智能指针是用来管理动态分配的内存的,不是随便拉个地址过来就可以用智能指针进行管理的
你这个是栈上的内存,不需要也不能用智能指针管理

一般来说,智能指针初始化的时候应该直接在括号里new,这样能避免错误
HasPtr ptr1( new int(), 42 );


[解决办法]
引用:
Quote: 引用:

智能指针是用来管理动态分配的内存的,不是随便拉个地址过来就可以用智能指针进行管理的
你这个是栈上的内存,不需要也不能用智能指针管理

一般来说,智能指针初始化的时候应该直接在括号里new,这样能避免错误
HasPtr ptr1( new int(), 42 );
明白你说的意思,那这段代码错误的本质是什么呢

只有通过new分配得到的地址才能delete
new和delete要一一对应
[解决办法]
栈上的内存不需要你delete回收,函数退出会自动回收。

智能指针是最常见的raii基础组件,用来管理堆内存的生命期,简化代码。
[解决办法]
栈上的对象不是通过 delete 来回收的.
是函数结束时通过操作 ESP 寄存器来调整栈指针, 回收内存. 如果是类有析构函数, 编译器会在函数结束前插入调用析构函数的指令.
[解决办法]


int obj = 0;
HasPtr ptr1( &obj, 42 );

上面一句作用域结束的时候,智能指针会根据传的地址,去删除该对象,你这里程序就会去delete &obj;
相当于干了这么件事情,删除栈区的内存,肯定是会报错了啊
改用这个就ok了
HasPtr ptr1( new int, 42 ); 这样才是真正使用了智能指针的功能,new 了个东东,不需要你手动去delete了

读书人网 >C++

热点推荐