智能指针示例

智能指针实际上就是通过模板技术实现的一个类

内存泄露(臭名昭著的Bug)——在软件开发和测试阶段都不容易被发现
-动态申请堆空间,用完后不归还
-C++语言中没有垃圾回收的机制
-指针无法控制所指堆空间的生命周期

当代C++软件平台中的智能指针
-指针生命周期结束时主动释放堆空间
-一片堆空间最多只能由一个指针标识

-杜绝指针运算和指针比较

智能指针的设计方案
-通过类模板描述指针的行为
  能够定义不同类型的指针对象
-重载指针特征操作符(->和*)
  利用对象模拟原生指针的行为

SmartPointer.h

#ifndef SMARTPOINTER_H_
#define SMARTPOINTER_H_

namespace DTLib
{
template <typename T>
class SmartPointer
{
protected:
    T* m_pointer;
public:
    SmartPointer(T* p =NULL)
    {
        m_pointer = p;
    }

    T* operator ->()
    {
        return m_pointer;
    }

    T& operator *()
    {
        return *m_pointer;
    }

    SmartPointer(const SmartPointer<T>& obj)
    {
        m_pointer = obj.m_pointer;
        const_cast<SmartPointer<T> &>(obj).m_pointer = NULL;
    }

    SmartPointer<T>& operator = (const SmartPointer<T>& obj)
    {
        if(this != &obj)
        {
            delete m_pointer;
            m_pointer = obj.m_pointer;
            const_cast<SmartPointer<T> &>(obj).m_pointer = NULL;
        }

        return *this;   //可以支持连续赋值
    }

    T* get()
    {
        return m_pointer;
    }

    bool isNull()
    {
        return (m_pointer == NULL);
    }

    ~SmartPointer()
    {
        delete m_pointer;
    }

};

}

#endif // SMARTPOINTER_H_

main.cpp

#include <iostream>
#include "SmartPointer.h"

using namespace std;
using namespace DTLib;

class Test
{
public:
    Test()
    {
        cout << "Test()" << endl;
    }
    ~Test()
    {
        cout << "~Test()" << endl;
    }

};

int main()
{

    SmartPointer<Test> sp = new Test();
    SmartPointer<Test> nsp;

    nsp = sp;
    cout << sp.isNull() << endl;
    cout << nsp.isNull() << endl;

    cout << "sp = " << sp.get() << endl;
    cout << "nsp = " << nsp.get() << endl;

    return 0;
}

智能指针的使用军规
只能用来指向堆空间中的单个对象或者变量
不能指向堆空间中的一个数组,也不能用来指向一个局部的对象或局部的变量

原文地址:https://www.cnblogs.com/-glb/p/12032012.html

时间: 2024-10-02 09:43:44

智能指针示例的相关文章

第九课、智能指针示例------狄泰软件学院

一.内存泄漏(臭名昭著的bug) (1).动态申请堆空间,用完后不归还 (2).c++语言中没有垃圾回收机制 (3).指针无法控制所指向的堆空间生命周期(如局部指针生命周期结束了堆空间的生命周期还未结束) 二.智能指针 1.当代c++平台的智能指针 (1).指针生命周期结束时主动释放堆空间 (2).一片堆空间最多只能由一个智能指针标识 (3).杜绝指针运算和指针比较 2.智能指针的设计方案 (1).通过类模板描述指针的行为:能够定义不同类型的指针变量 (2).重载指针特征操作符(->和*):利用

c语言智能指针 附完整示例代码

是的,你没有看错, 不是c++不是c#, 就是你认识的那个c语言. 在很长一段时间里,c的内存管理问题, 层出不穷,不是编写的时候特别费劲繁琐, 就是碰到内存泄漏排查的各种困难, 特别在多线程环境下,就难上加难了, 诸如此类的老大难问题. c++用它的RAII机制妥妥影响了一代程序员. RAII大概介绍下,就不做科普, 有需要的同学,百度一下了解细节. 什么是RAII 资源获取即初始化 (Resource Acquisition Is Initialization, RAII),RAII是一种资

智能指针 std::auto_ptr 和 shared_ptr

需要注意: auto_ptr 类可以用于管理由 new 分配的单个对象,但是无法管理动态分配的数组(我们通常不会使用数组,而是使用 vector 代替数组).auto_ptr 在拷贝和赋值的时候有不寻常的行为,因此 auto_ptrs 不能被保存在 stl 的容器中.当 auto_ptr 离开了自己的作用域或者被销毁,由 auto_ptr 管理的对象也会被销毁. 使用std::auto_ptr需要的头文件: #include <memory> // 示例 1(b): 安全代码, 使用了auto

(转)剖析C++标准库智能指针(std::auto_ptr)

不可否认,资源泄露(resource leak)曾经是C++程序的一大噩梦.垃圾回收 机制(Garbage Collection)一时颇受注目.然而垃圾自动回收机制并不能 满足内存管理的即时性和可视性,往往使高傲的程序设计者感到不自在. 况且,C++实现没有引入这种机制.在探索中,C++程序员创造了锋利的 "Smart Pointer".一定程度上,解决了资源泄露问题. 也许,经常的,你会写这样的代码: //x拟为class: // class x{ // public: // int

现代C++学习笔记之一入门篇:智能指针(C++ 11)

原始指针:通过new建立的*指针 智能指针:通过智能指针关键字(unique_ptr, shared_ptr ,weak_ptr)建立的指针 在现代 C++ 编程中,标准库包含智能指针,该指针用于确保程序不存在内存和资源泄漏且是异常安全的. 在现代 C++ 中,原始指针仅用于范围有限的小代码块.循环或者性能至关重要且不会混淆所有权的 Helper 函数中. 1 void UseRawPointer() 2 { 3 // Using a raw pointer -- not recommended

auto_ptr,shared_ptr 智能指针的使用

Q: 那个auto_ptr是什么东东啊?为什么没有auto_array?A: 哦,auto_ptr是一个很简单的资源封装类,是在<memory>头文件中定义的.它使用“资源分配即初始化”技术来保证资源在发生异常时也能被安全释放(“exception safety”).一个auto_ptr封装了一个指针,也可以被当作指针来使用.当其生命周期到了尽头,auto_ptr会自动释放指针.例如: #include<memory> using namespace std;  struct X

指针辨析:悬垂指针、哑指针、野指针、智能指针

悬垂指针: 1:提出的原因: 请看下面的代码片段: [cpp] view plaincopyprint? int *p=NULL; void main() { int i=10;p=&i; cout<<"第一次:*p = "<<*p<<endl; cout<<"第二次:*p = "<<*p<<endl; } [cpp] view plaincopyprint? int *p=NULL;

智能指针学习笔记

1. 介绍 本文介绍智能指针的使用.智能指针是c++ 中管理资源的一种方式,用智能指针管理资源,不必担心资源泄露,将c++ 程序员 从指针和内存管理中解脱出来,再者,这也是c++发展的趋势(这话不是我说的,见<Effective c++>和<c++实践编程>),应该认真学习一下. 智能指针中,最有名的应该数auto_ptr,该智能指针已经被纳入标准库,只需要包含<memory>头文件即可以使用,另外,TR1文档定义的shared_ptr和weak_ptr也已经实现(我用

boost智能指针之shared_ptr和weak_ptr

std::auto_ptr很多的时候并不能满足我们的要求,比如auto_ptr不能用作STL容器的元素.boost的smart_ptr中提供了4种智能指针和2种智能指针数组来作为std::auto_ptr的补充. shared_ptr<boost/shared_ptr.hpp>:使用shared_ptr进行对象的生存期自动管理,使得分享资源所有权变得有效且安全. weak_ptr<boost/weak_ptr.hpp>:weak_ptr 是 shared_ptr 的观察员.它不会干