auto_ptr 用例1

auto_ptr // 头文件 <memory>

std::auto_ptr<ClassA> ptr1(new ClassA); // ok
std::auto_ptr<ClassA> ptr2 = new ClassA; // error 不允许 赋值(assign)初始化方式
auto_ptr赋值会导致所有权的转移

auto_ptr错误运用:
1.auto_ptr之间不能共享拥有的所有权
2.不能让auto_ptr指向数组,因为是透过delete而没有delete[

1.所有权的变更

#include <iostream>
#include <memory>
using namespace std;

template <class T>
ostream& operator<<(ostream& out, const auto_ptr<T>& p)
{
    if(p.get() == NULL)
        out<<"NULL";
    else
        out<<*p;

    return out;
}

int main()
{
    auto_ptr<int> p(new int(42));
    auto_ptr<int> q;

    cout<<"after init..\n";
    cout<<"p = "<<p<<endl;
    cout<<"q = "<<q<<endl;

    q = p;
    cout<<"after assign..\n";
    cout<<"p = "<<p<<endl;
    cout<<"q = "<<q<<endl;    

    *q += 13;
    p = q;
    cout<<"after change and assign..\n";
    cout<<"p = "<<p<<endl;
    cout<<"q = "<<q<<endl;        

}

输出结果:

after init..
p = 42
q = NULL
after assign..
p = NULL
q = 42
after change and assign..
p = 55
q = NULL

时间: 2024-11-09 06:01:24

auto_ptr 用例1的相关文章

C++中的智能指针(auto_ptr)

实际上auto_ptr 只是C++标准库提供的一个类模板,它与传统的new/delete控制内存相比有一定优势,使用它不必每次都手动调用delete去释放内存.当然有利也有弊,也不是完全完美的. 本文从下面的8个方面来总结auto_ptr使用的大部分内容. 1. auto_ptr是什么? auto_ptr 是C++标准库提供的类模板,auto_ptr对象通过初始化指向由new创建的动态内存,它是这块内存的拥有者,一块内存不能同时被分给两个这样拥有者(auto_ptr).当auto_ptr对象生命

C++实现一个线程安全的单例工厂

我们见到经常有人用 static 局部对象的方式实现了类似单例模式,最近发现一篇文章明确写明 编译器在处理  static局部变量的时候 并不是线程安全的 !!! http://blogs.msdn.com/b/oldnewthing/archive/2004/03/08/85901.aspx 于是实现了一个单例工厂  并且是线程安全的 #ifndef SINGLETONFACTORY_H #define SINGLETONFACTORY_H #include "windows.h"

std::auto_ptr

1, auto_ptr类 auto_ptr是一个模板类,定义如下: template <typename Type> class auto_ptr {...}: 它存储的是一个指向Type的指针. 顾名思义,auto_ptr是一种智能指针,它包含一个动态分配内存的指针,并在它生命周期结束的时候,销毁包含的指针所指向的内存. 例1: void f() { Type* pt(new Type); //一些代码... delete pt; } 这样的代码很常见,但它有可能造成内存泄露.首先你用了ne

C++ Primer 学习笔记_24_类与数据抽象(10)--static 与单例模式、auto_ptr与单例模式、const成员函数、const 对象、mutable修饰符

C++ Primer 学习笔记_24_类与数据抽象(10)--static 与单例模式.auto_ptr与单例模式.const成员函数.const 对象.mutable修饰符 前言 [例]写出面向对象的五个基本原则? 解答:单一职责原则,开放封闭原则,依赖倒置原则,接口隔离原则和里氏替换原则 里氏替换原则:子类型必须能够替换他们的基类型. 设计模式分为三种类型:创建型模式.结构型模式和行为型模式 一.static 与单例模式 1.单例模式 单例模式的意图:保证一个类仅有一个实例,并提供一个访问它

关于std:auto_ptr std:shared_ptr std:unique_ptr

很多人听说过标准auto_ptr智能指针机制,但并不是每个人都天天使用它.这真是个遗憾,因为auto_ptr优雅地解决了C++设计和编码中常见的问题,正确地使用它可以生成健壮的代码.本文阐述了如何正确运用auto_ptr来让你的代码更加安全——以及如何避免对auto_ptr危险但常见的误用,这些误用会引发间断性发作.难以诊断的bug. 1.为什么称它为“自动”指针?auto_ptr只是众多可能的智能指针之一.许多商业库提供了更复杂的智能指针,用途广泛而令人惊异,从管理引用的数量到提供先进的代理服

C++安全异常std:auto_ptr

auto_ptr它是C++标准库(<utility>)为了一个智能指针类模板来解决资源泄漏所提供的问题(注意:这只是一个简单的智能指针) auto_ptr在事实原则的实现RAII,对资源的访问,在施工时间.释放资源时,析构函数,而相关的指针操作超载.使用起来就像普通的指针. std::auto_ptr<ClassA> pa(new ClassA); 非常多人听说过标准auto_ptr智能指针机制,但并非每一个人都天天使用它.这真是个遗憾.由于auto_ptr优雅地攻克了C++设计和

【C++智能指针 auto_ptr】

<More Effective C++>ITEM M9中提到了auto_ptr,说是当异常产生的时候,怎么释放为对象分配的堆内存,避免重复编写内存释放语句. PS:这里书里面提到函数退出问题,函数退出会清理栈内存,不管是怎么正常退出还是异常退出(仅有一种例外就是当你调用 longjmp 时.Longjmp 的这个缺点是 C++率先支持异常处理的主要原因).建立在此基础上我们才把对指针的删除操作封装到一个栈对象里面.这样函数退出(异常或是正常)就会调用对象的析构函数,达到我们自动清理所封装指针指

设计一个线程安全的单例(Singleton)模式

在设计单例模式的时候,虽然很容易设计出符合单例模式原则的类类型,但是考虑到垃圾回收机制以及线程安全性,需要我们思考的更多.有些设计虽然可以勉强满足项目要求,但是在进行多线程设计的时候.不考虑线程安全性,必然会给我们的程序设计带来隐患.此处,我们不介绍什么是单例模式,也不介绍如何设计简单的设计模式,因为你完全可以在书上或者在博客中找到.此处我们的目的就是设计一个使用的单例模式类.单例模式需要注意与思考的问题: (1)如何仅能实例化一个对象? (2)怎么样设计垃圾回收机制? (3)如何确保线程安全性

C++智能指针--auto_ptr指针

auto_ptr是C++标准库提供的类模板,头文件<memory>,auto_ptr对象通过初始化指向由new创建的动态内存,它是这块内存的拥有者,一块内存不能同时被分给两个拥有者.当auto_ptr对象生命周期结束时,其析构函数会将auto_ptr对象拥有的动态内存自动释放.即使发生异常,通过异常的栈展开过程也能将动态内存释放.auto_ptr不支持new数组. auto_ptr的出现,主要是为了解决"有异常抛出时发生内存泄漏"的问题.如下的简单代码是这类问题的一个简单示