C++拾遗--智能指针

C++拾遗--智能指针

前言

内存泄露是常见的问题,新标准中的智能指针从根本上解决了这个问题。所谓的智能指针,其智能性体现在:当没有对象使用某块动态分配的内存时,那就自动释放这片内存。

智能指针

下面这段程序可耗尽内存,导致程序崩溃。

#include <iostream>
#include <Windows.h>
using namespace std;

int main()
{
	while (1)
	{
		//每次动态分配80M内存
		double *p = new double[1024 * 1024 * 10];
		Sleep(2000);
	}
	return 0;
}

这就不运行了……

众所周知,动态分配的内存需要手动释放,每次分配80M,不用多久内存就会耗尽。

使用智能指针,就不会出现这种情况,如下

#include <iostream>
#include <Windows.h>
#include <memory>
using namespace std;

int main()
{
	while (1)
	{
		//每次分配800M内存
		shared_ptr<double>p(new double[1024 * 1024 * 100]);
		Sleep(2000);
	}
	return 0;
}

运行后,观察内存使用情况,最多也只是在800M左右。

以上两例,粗略看出智能指针的安全性,不过这一切都建立在正确使用的前提下。下面来仔细探讨下标准库提供的智能指针的使用方法。

标准库中主要提供了两种智能指针:shared_ptr 和 unique_ptr。它们都是模板,主要区别是shared_ptr允许多个指针指向同一个对象,unique_ptr则独享一片内存。

共享操作

shared_ptr和unique_ptr都支持的操作

  • shared_ptr<T> p, unique_ptr<T> q 创建指向类型T的空智能指针
  • *p,解引用操作,获取它指向的对象,类型是T
  • p,将p当做条件判断,若p指向一个对象,则为true
  • p.get(),返回p指向对象的指针,类型是T*

shared_ptr

shared_ptr的独享操作

  • make_shared<T>(arg_list); 返回一个shared_ptr,指向一个动态分配的类型为T的对象,并且使用arg_list初始化对象。
  • shared_ptr<T>p(q); 把shared_ptr q拷贝赋值给p,此操作会增加q中的计数器
  • p = q; p的计数器减少,q的计数器增加
  • p.use_count(); 返回与p共享对象的智能指针数量
  • p.unique(); 若p.use_count()为1,返回true

代码演示

#include <iostream>
#include <Windows.h>
#include <string>
#include <memory>
using namespace std;

int main()
{
	cout << "******shared_ptr演示***by David***" << endl;
	auto sp1 = make_shared<int>(12);
	auto i1 = sp1.get();
	cout << typeid(i1).name() << endl;    //int *
	cout << "*sp1 = " << *sp1 << endl;
	auto sp2 = make_shared<string>("zhangxiang");
	auto i2 = sp2.get();
	cout << typeid(i2).name() << endl;    //string *
	cout << "*sp2 = " << *sp2 << endl;
	auto i3 = *sp2;
	cout << typeid(i3).name() << endl;    //string
	auto sp3 = make_shared<string>("David");
	cout << "sp2.unique() = " << sp2.unique() << endl;
	cout << "sp2.use_count() = " << sp2.use_count() << endl;
	cout << "sp3.use_count() = " << sp2.use_count() << endl;
	sp2 = sp3;
	cout << "sp2.use_count() = " << sp2.use_count() << endl;
	cout << "sp3.use_count() = " << sp2.use_count() << endl;
	cin.get();
	return 0;
}

运行

unique_ptr

unique_ptr独享一片内存,所以不支持拷贝和构造(有例外)

本专栏目录

所有内容的目录

时间: 2024-10-06 04:38:37

C++拾遗--智能指针的相关文章

智能指针的原理和简单实现

什么是智能指针? 智能指针实质上是一个类,定义一个类来封装资源的分配和释放.这个类的构造函数中传入一个指针,完成资源的分配和初始化.在析构函数中释放传入的该指针,完成资源的释放. 为什么要用智能指针? 智能指针就是智能,自动化的管理指针所指向的动态资源. 例如以下情况:代码中经常会忘记释放动态开辟的内存资源,导致内存泄露. // case1 void Test2() {  int* p1 = new int(2);  bool isEnd = true;  //...  if (isEnd)  

实战c++中的智能指针unique_ptr系列-- 使用std::unique_ptr代替new operator(错误:‘unique_ptr’ is not a member of ‘std’)

写了很多篇关于vector的博客,其实vector很便捷,也很简单.但是很多易错的问题都是vector中的元素为智能指针所引起的.所以决定开始写一写关于智能指针的故事,尤其是unique_ptr指针的故事. 这是个开始,就让我们使用std::unique_ptr代替new operator吧! 还是用程序说话: #include<iostream> int main() { while (true) int *x = new int; } 看下任务管理器中的内存: 此时使用智能指针unique

C++智能指针简单剖析

导读 最近在补看<C++ Primer Plus>第六版,这的确是本好书,其中关于智能指针的章节解析的非常清晰,一解我以前的多处困惑.C++面试过程中,很多面试官都喜欢问智能指针相关的问题,比如你知道哪些智能指针?shared_ptr的设计原理是什么?如果让你自己设计一个智能指针,你如何完成?等等--.而且在看开源的C++项目时,也能随处看到智能指针的影子.这说明智能指针不仅是面试官爱问的题材,更是非常有实用价值. 下面是我在看智能指针时所做的笔记,希望能够解决你对智能指针的一些困扰. 目录

boost智能指针使用

#include <iostream> #include <tr1/memory> #include <boost/scoped_ptr.hpp> //scoped_ptr还不属于tr1 #include <boost/scoped_array.hpp> //scored_array也不属于tr1 #include <boost/shared_array.hpp> //shared_array也不属于tr1 class CTest { publi

webkit智能指针 - RefPtr, PassRefPtr

历史 2005年之前,Webkit中很多对象都采用引用计数的方式.它们通过继承RefCounted]类模板来实现这种模式.RefCounted主要是实现了ref()和deref()两个函数.在需要引用对象时要调用ref()增加引用计数,在不再需要对象时,要调用deref()函数减少引用计数.ref()和deref()需要成对出现.这和使用new/delete一样,多调用.少调用.没调用的问题总是时有发生.如果能由编译器自动完成ref, deref的调用,C/C++编程的bug至少也可以减少一半以

智能指针tr1::shared_ptr、boost::shared_ptr使用

对于tr1::shared_ptr在安装vs同时会自带安装,但是版本较低的不存在.而boost作为tr1的实现品,包含 "Algorithms Broken Compiler Workarounds Concurrent Programming Containers Correctness and Testing Data Structures Domain Specific Function Objects and Higher-order Programming Generic Progra

C++ Primer笔记8_动态内存_智能指针

1.动态内存 C++中,动态内存管理是通过一对运算符完成的:new和delete.C语言中通过malloc与free函数来实现先动态内存的分配与释放.C++中new与delete的实现其实会调用malloc与free. new分配: 分配变量空间: int *a = new int; // 不初始化 int *b = new int(10); //初始化为10 string *str = new string(10, ); 分配数组空间: int *arr = new int[10];//分配的

C++之智能指针20170920

/******************************************************************************************************************/ 一.C++智能指针_自己实现智能指针 1.使用局部变量结合new的方式,防止new导致的内存泄漏 class sp { private: Person *p; public: sp() : p(0) {}//表明sp的构造函数 继承person的无参构造函数 sp(

智能指针简介

智能指针用于解决常规指针所带来的内存泄露.重复释放.野指针等内存问题.智能指针基于这样的事实得以发挥作用:定义在栈中的智能指针,当超出其作用域时,会自动调用它的析构函数,从而可以释放其关联的内存资源. 之前C++标准库中定义的智能指针std::auto_ptr<T>,因其设计存在缺陷,所以已不再推荐使用.C++11引入了新的智能指针:unique_ptr.shared_ptr和weak_ptr. 一:unique_ptr unique_ptr类似于auto_ptr.两个unique_ptr实例