小和尚上山学习之智能指针(一)--auto_ptr

// smart_point.cpp : 定义控制台应用程序的入口点。
//
由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete。程序员忘记 delete,流程太复杂,最终导致没有 delete,异常导致程序过早退出,没有执行 delete 的情况并不罕见。
用智能指针便可以有效缓解这类问题,本文主要讲解参见的智能指针的用法。包括:std::auto_ptr、boost::scoped_ptr、boost::shared_ptr、boost::scoped_array、boost::shared_array、boost::weak_ptr、boost:: intrusive_ptr。
 
#include "stdafx.h"
#include <iostream>
 
#include <memory>
 
//测试类
class Simple {
public:
	Simple(int param = 0) {
		number = param;
		std::cout << "Simple: " << number << std::endl;
	}
	~Simple() {
		std::cout << "~Simple: " << number << std::endl;
	}
	void PrintSomething() {
		std::cout << "PrintSomething: " << info_extend.c_str() << std::endl;
	}
	std::string info_extend;
	int number;
};
//测试函数
void TestAutoPtr() {
	std::auto_ptr<Simple> my_memory(new Simple(1));   // 创建对象,输出:Simple:1 只能指针是一个对象 保存的数据为堆栈类的指针
	if (my_memory.get()) {                            // 判断智能指针是否为空
		my_memory->PrintSomething();                    // 使用 operator-> 调用智能指针对象中的函数
		my_memory.get()->info_extend = "Addition";      // 使用 get() 返回裸指针,然后给内部对象赋值
		my_memory->PrintSomething();                    // 再次打印,表明上述赋值成功
		(*my_memory).info_extend += " other";           // 使用 operator* 返回智能指针内部对象,然后用“.”调用智能指针对象中的函数
		my_memory->PrintSomething();                    // 再次打印,表明上述赋值成功
	}
}                                                   // my_memory 栈对象即将结束生命期,析构堆对象 Simple(1)
 
 
int _tmain(int argc, _TCHAR* argv[])
{
 
	TestAutoPtr();
	return 0;
}
 
Simple: 1
PrintSomething :
PrintSomething : Addition
PrintSomething : Addition other
 
~ Simple : 1
注意事项:
1)     尽量不要使用“operator=”。如果使用了,请不要再使用先前对象。

(2)    记住 release() 函数不会释放对象,仅仅归还所有权。

(3)    std::auto_ptr 最好不要当成参数传递(读者可以自行写代码确定为什么不能)。

(4)    由于 std::auto_ptr 的“operator=”问题,有其管理的对象不能放入 std::vector 等容器中。

 
 

                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值