高效使用auto_ptr

auto_ptr是C++标准库中<memory>为了解决资源泄漏的问题提供的一个智能指针类模板。auto_ptr的实现原理是RAII,在构造的时获取资源,在析构的时释放资源。

下面通过一个例子掌握auto_ptr的使用和注意事项。

事例类的定义:


#pragma once
#include <iostream>
using namespace std;
class Test
{
public:
Test();
~Test(void);
int id;
int GetId();

};
#include "Test.h"
int count=0;
Test::Test()
{
count++;
id=count;
cout<<"Create Test"<<this->id<<endl;
}

Test::~Test(void)
{
cout<<"Destory Test"<<this->id<<endl;
}
int Test::GetId()
{

return id;
}

auto_ptr的使用:


#include "Test.h"
#include <memory>
using namespace std;
void Sink(auto_ptr<Test> a)
{
cout <<"Sink ";
///*转移所有权给a,此时test1无效了,在函数中为形参,函数结束则释放。
}
auto_ptr<Test> Source()
{
auto_ptr<Test> a(new Test());
return a;
}
int main(int arg,char * agrs)
{

auto_ptr<Test> test1=Source();
auto_ptr<Test> test2_1(new Test());
auto_ptr<Test> test2_2=test2_1; /*转移所有权,此时test2_1无效了*/
Sink(test1);

cout <<"test2_2 Id "<< test2_2->GetId()<<endl;
// cout << test2_1->GetId()<<endl;//出错,此时test2_1无效,

return 0;
}

运行结果:

高效使用auto_ptr,布布扣,bubuko.com

时间: 2025-01-13 01:24:15

高效使用auto_ptr的相关文章

c++内存管理学习纲要

本系列文章,主要是学习c++内存管理这一块的学习笔记. 时间:6.7-21 之下以技术内幕的开头语,带入到学习C++内存管理的技术中吧: 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,因此要想成为C++高手,内存管理一关是必须要过的! 笔记汇总: 1.C++内存管理学习笔记(1) 2.C++内存管理学习笔记(2) 3.C++内存管理学习笔记(3) 4.C++内存管理学习笔记(4) 5.C++内存管理学习笔记(5) 6.C++内存管理学习笔记(6) 7.C++内存管理学习笔记(7

高效C++ --经验条款(三)

高效C++ --经验条款(三) 给多态基类声明virtual析构函数: "给base classes一个virtual析构函数",这个规则只适用于带有多态性质的base classes身上.这种base classes的设计目的是为了用来"通过base class接口处理derived class对象". 并非所有base classes的设计目的都是为了多态用途.例如标准stirng和STL容器都不被设计作为base classes使用,更别提多态了.某些clas

[C++]高效使用容器的一些建议

高效使用容器的一些建议 本文介绍一些在使用容器中常见的问题,并给出其解决方法从而提升对容器的认识和使用. 1. 不要试图编写独立于容器类型的代码 STL是以泛化原则为基础的:数组被泛化为"以其包含的对象的类型为参数"的容器:函数被泛化为"以其使用的迭代器的类型为参数"的算法:指针被泛化为"以其指向的对象的类型为参数"的迭代器. 如果我们试图编写独立于容器类型的代码,例如编写一个既能够满足序列容器又满足关联容器的代码,我们最后会发现我们使用的只是他

C++STL----容器高效使用

1. 容器中对象拷贝高效.防剥离发生的方法: 使容器包含指针而不是对象.(ps:STL容器是在创建拷贝,相比数组,是动态创建,节省时间和空间) 2. 总是调用empty()而不是size==0来判断容器是否为空: empty()对所有STL容器都是常数时间操作,而size()对某些容器(如list)是线性时间操作,size()更耗时. 3. vector.list.deque的比较: (1)vector是连续存储结构,相比数组,多了动态内存管理. 优点是:支持高效的随机访问,支持尾端高效插入/删

Nginx为什么比Apache Httpd高效:原理篇

一.进程.线程? 进程是具有一定独立功能的,在计算机中已经运行的程序的实体.在早期系统中(如linux 2.4以前),进程是基本运作单位,在支持线程的系统中(如windows,linux2.6)中,线程才是基本的运作单位,而进程只是线程的容器.程序 本身只是指令.数据及其组织形式的描述,进程才是程序(那些指令和数据)的真正运行实例.若干进程有可能与同一个程序相关系,且每个进程皆可以同步(循 序)或异步(平行)的方式独立运行.现代计算机系统可在同一段时间内以进程的形式将多个程序加载到存储器中,并借

如何使用Flexbox和CSS Grid,实现高效布局

CSS 浮动属性一直是网站上排列元素的主要方法之一,但是当实现复杂布局时,这种方法不总是那么理想.幸运的是,在现代网页设计时代,使用 Flexbox 和 CSS Grid 来对齐元素,变得相对容易起来. 使用 Flexbox 可以使元素对齐变得容易,因此 Flexbox 已经被广泛使用了. 同时,CSS Grid 布局也为网页设计行业带来了很大的便利.虽然 CSS Grid 布局未被广泛采用,但是浏览器逐渐开始增加对 CSS Grid 布局的支持. 虽然 Flexbox 和 CSS Grid 可

STM32F4XX高效驱动篇2 I2C

说到I2C很多用过STMF10X硬件I2C方式的工程师,都感觉有点头痛.大部分还是使用软件模拟的方式,I2C由于一般的工作频率是400,100KHz.所以在平凡读取,或所读数据量大时,使用这模拟的方式,还是比较浪费CPU有效工作时间的. 在之前的使用I2C的经历中,主要是I2C死锁问题让我也困扰了一段时间.不过后来经过多方资料,最后还是把这个问题解决了.以下驱动程序已集成了此功能. 什么是死锁,在I2C主设备进行读写操作的过程中.主设备在开始信号后控制SCL产生8个时钟脉冲,然后拉低SCL信号为

STM32F4XX高效驱动篇1-UART

之前一直在做驱动方面的整理工作,对驱动的高效性有一些自己的理解这里和大家分享一下.并奉驱动程序,本程序覆盖uart1-8. 串口驱动,这是在每个单片机中可以说是必备接口.可以说大部分产品中都会使用,更有甚者一个产品中用到8个串口.这样一个高效的驱动是决定您产品优劣的关键因素.本文主要针对STM32F4XX系列芯片做的一个驱动接口层.以减少您在开发项目时驱动方面所花费时间,以及为程序达到高效的处理为目的. 从51,pic到现在的STM32,个人感觉STM32这方面做的非常突出,丰富的使用模式,强大

构建高效可申缩的结果缓存

摘自<<JAVA并发编程实战>> public interface Computable<A, V> { V comput(A arg); } import java.util.concurrent.*; /** * 构建高效可申缩的结果缓存 * <p> * author: shiruiqiang * time: 31/01/2017 23:11 **/ public class Memoizer<A, V> implements Computa