C++PrimerPlus(第6版)中文版:Chapter16.2智能指针模版类smrtptrs.cpp

本文介绍了智能指针的概念,以解决C++中手动内存管理可能导致的内存泄漏问题。通过示例展示了auto_ptr、unique_ptr和shared_ptr三种智能指针的使用,它们在对象生命周期结束时自动调用析构函数释放内存。在C++11中,auto_ptr已被弃用,推荐使用unique_ptr和shared_ptr。文章还给出了使用智能指针的示例代码及其运行结果,强调了智能指针在内存管理中的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本小节讲智能指针模版类。

智能指针是行为类似于指针的类对象。

void remodel(std::string &str)
{
     string * ps=new string(str);
     ...
     str=*ps;
     return;
}

每当调用的时候,该函数都会分配堆中的内存,但从不收回,从而导致内存泄漏。

解决之道就是可以在return语句之前添加下面的delete语句,即可

delete ps;这样就可以释放内存了。

但是,涉及到别忘了,实际中就会发生忘记的情况,不是最佳的解决方案。来看看需要怎么做呢?

当remodel()这样的函数终止的时候,本地变量都将从栈内存中删除。因此,指针ps占据的内存将被释放,如果ps指向的内存也被释放,该有多好!,如果ps有一个析构函数,该析构函数在ps过期的时候释放它所指向的内存。因此,ps的问题在于它只是一个常规的指针,它不是具有析构函数的对象。如果它是对象,那么对象过期的时候,让它的析构函数删除指向的内存。这就是:auto_ptr  、unique_ptr、shared_ptr 背后的思想。auto_ptr 是C++98提供的解决方案,C++11已经将它抛弃,并提供了另外的两种解决方案。

这三个智能指针模版(auto_ptr  、unique_ptr、shared_ptr)都定义了类似指针的对象,可以将new获得(直接或者间接)的地址赋给这种对象。当智能指针过期时,其析构函数将使用delete来释放内存,自动就释放了。

要创建智能指针对象,必须包含投文件memory,该文件包括模版定义。

程序清单16.5 smrtptrs.cpp

// Example16.5_smrtptrs.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <string>
#include <memory>
using std::cout;

class Report
{
private:
	std::string str;
public:
	Report(const std::string s) :str(s)
	{
		cout << "Object Created!\n";
	}
	~Report(){cout<< "Object Deleted!\n";}
	void comment()const{ cout << str<<"\n"; }
};

int main()
{
  //  std::cout << "Hello World!\n";
	{
		std::auto_ptr<Report> ps(new Report("Using auto_ptr"));
		ps->comment();//use -> to invoke a member function 
	}

	{
		std::shared_ptr<Report> ps(new Report("Using shared_ptr"));
		ps->comment();//use -> to invoke a member function 
	}

	{
		std::unique_ptr<Report> ps(new Report("Using unique_ptr"));
		ps->comment();//use -> to invoke a member function 
	}
}


结果:

Object Created!
Using auto_ptr
Object Deleted!
Object Created!
Using shared_ptr
Object Deleted!
Object Created!
Using unique_ptr
Object Deleted!

这三个种,auto_ptr 已经过时,unique和share的使用还是有一些区别,具体在这里不展开了,掌握这种思想很重要,析构函数中释放内存这样真不错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值