C++中智能指针的实现

C++中的智能指针是用一个类对另一个对象的指针或者引用进行管理,具体对该类的管理可以用包含对象指针以及引用计数的类来记录;

一般有两种方式实现:

1. 在对象内部记录引用的个数,这需要对象预留引用计数相关的接口

2. 用一个单独的资源管理类进行管理,则不需要修改对象

下面主要是第二种方法:(参考)http://blog.csdn.net/hackbuteer1/article/details/7561235

智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象共享同一指针。每次创建类的新对象时,初始化指针并将引用计数置为1;当对象作为另一对象的副本而创建时,拷贝构造函数拷贝指针并增加与之相应的引用计数;对一个对象进行赋值时,赋值操作符减少左操作数所指对象的引用计数(如果引用计数为减至0,则删除对象),并增加右操作数所指对象的引用计数;调用析构函数时,构造函数减少引用计数(如果引用计数减至0,则删除基础对象)。

#include<iostream>

using namespace std;

// 定义仅由HasPtr类使用的U_Ptr类,用于封装使用计数和相关指针  

// 这个类的所有成员都是private,我们不希望普通用户使用U_Ptr类,所以它没有任何public成员

// 将HasPtr类设置为友元,使其成员可以访问U_Ptr的成员

class U_Ptr

{

friend class HasPtr;  

int *ip;

size_t use;

U_Ptr(int *p) : ip(p) , use(1)

{

cout << "U_ptr constructor called !" << endl;

}

~U_Ptr()

{

delete ip;

cout << "U_ptr distructor called !" << endl;

}

};

class HasPtr

{

public:

// 构造函数:p是指向已经动态创建的int对象指针

HasPtr(int *p, int i) : ptr(new U_Ptr(p)) , val(i)

{

cout << "HasPtr constructor called ! " << "use = " << ptr->use << endl;

}

// 复制构造函数:复制成员并将使用计数加1

HasPtr(const HasPtr& orig) : ptr(orig.ptr) , val(orig.val)

{

++ptr->use;

cout << "HasPtr copy constructor called ! " << "use = " << ptr->use << endl;

}

// 赋值操作符

HasPtr& operator=(const HasPtr&);  

// 析构函数:如果计数为0,则删除U_Ptr对象

~HasPtr()

{

cout << "HasPtr distructor called ! " << "use = " << ptr->use << endl;

if (--ptr->use == 0)

delete ptr;

}

// 获取数据成员

int *get_ptr() const

{

return ptr->ip;

}

int get_int() const

{

return val;

}

// 修改数据成员

void set_ptr(int *p) const

{

ptr->ip = p;

}

void set_int(int i)

{

val = i;

}

// 返回或修改基础int对象

int get_ptr_val() const

{

return *ptr->ip;

}

void set_ptr_val(int i)

{

*ptr->ip = i;

}

private:

U_Ptr *ptr;   //指向使用计数类U_Ptr

int val;

};

HasPtr& HasPtr::operator = (const HasPtr &rhs)  //注意,这里赋值操作符在减少做操作数的使用计数之前使rhs的使用技术加1,从而防止自我赋值

{

// 增加右操作数中的使用计数

++rhs.ptr->use;

// 将左操作数对象的使用计数减1,若该对象的使用计数减至0,则删除该对象

if (--ptr->use == 0)

delete ptr;

ptr = rhs.ptr;   // 复制U_Ptr指针

val = rhs.val;   // 复制int成员

return *this;

}

int main(void)

{

int *pi = new int(42);

HasPtr *hpa = new HasPtr(pi, 100);    // 构造函数

HasPtr *hpb = new HasPtr(*hpa);     // 拷贝构造函数

HasPtr *hpc = new HasPtr(*hpb);     // 拷贝构造函数

HasPtr hpd = *hpa;     // 拷贝构造函数

cout << hpa->get_ptr_val() << " " << hpb->get_ptr_val() << endl;

hpc->set_ptr_val(10000);

cout << hpa->get_ptr_val() << " " << hpb->get_ptr_val() << endl;

hpd.set_ptr_val(10);

cout << hpa->get_ptr_val() << " " << hpb->get_ptr_val() << endl;

delete hpa;

delete hpb;

delete hpc;

cout << hpd.get_ptr_val() << endl;

int *p2 = new int(56);

HasPtr *ka = new HasPtr(p2,57);

cout<<ka->get_ptr_val()<<" "<<ka->get_ptr_val()<<endl;

return 0;

}

更简单的实现:仅对一个对象进行管理

存在的问题: 没有理解智能指针的本质,用static 变量来保存所生成该对象引用的个数,会导致对无法对别的对象进行管理。(如果新生成一个资源对象,则static变量并不会归1,另外资源管理类赋值或者拷贝构造函数是对对象的拷贝或者赋值,而不是引用。 今天犯了一个大错误,this是当前对象的指针,要引用其成员变量,需要用->,最近编写java多了,C中指针基本操作给忘了)

#include <iostream>

using namespace std;

class Book {

public:

Book(int no):no(no){

}

void test(){

cout<<no<<endl;

}

~Book(){

cout<<"~Book"<<endl;

}

private:

int no;

};

class SmartPtr {

public:

static int cnt;

SmartPtr(){

}

SmartPtr(Book *t){

this->t = t;

cnt++;

}

SmartPtr( SmartPtr  &rhs){

rhs.cnt++;

this->t = rhs.t;

}

SmartPtr(SmartPtr * rhs){

rhs->cnt++;

t = rhs->t;

}

SmartPtr  operator=(const SmartPtr  &rhs){

if(this==&rhs) {

return *this;

}

rhs.cnt++;

this->t = rhs.t;

return *this;

}

Book operator*(){

return *t;

}

Book * operator->(){

return t;

}

~SmartPtr() {

cout<<"enter the descrutor:"<< cnt<<endl;

if(--cnt == 0) {

delete t;

}

cout<<cnt<<endl;

}

private:

Book * t;

};

int SmartPtr::cnt = 0;

int main(){

Book *b1 = new Book(3);

SmartPtr *sp1 = new SmartPtr(b1);

SmartPtr *sp2 = new SmartPtr(sp1);

SmartPtr *sp3 = new SmartPtr(sp1);

(*sp3)->test();

delete sp3;

delete sp2;

delete sp1;

return 0;

}

C++中智能指针的实现,布布扣,bubuko.com

时间: 2024-10-19 02:24:44

C++中智能指针的实现的相关文章

C++中智能指针的设计和使用

转载请标明出处,原文地址:http://blog.csdn.net/hackbuteer1/article/details/7561235      智能指针(smart pointer)是存储指向动态分配(堆)对象指针的类,用于生存期控制,能够确保自动正确的销毁动态分配的对象,防止内存泄露.它的一种通用实现技术是 使用引用计数(reference count).智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象共享同一指针.每次创建类的新对象时,初始化指针并将引用计数置为

C++11中智能指针的原理、使用、实现

目录 理解智能指针的原理 智能指针的使用 智能指针的设计和实现 1.智能指针的作用 C++程序设计中使用堆内存是非常频繁的操作,堆内存的申请和释放都由程序员自己管理.程序员自己管理堆内存可以提高了程序的效率,但是整体来说堆内存的管理是麻烦的,C++11中引入了智能指针的概念,方便管理堆内存.使用普通指针,容易造成堆内存泄露(忘记释放),二次释放,程序发生异常时内存泄露等问题等,使用智能指针能更好的管理堆内存. 理解智能指针需要从下面三个层次: 从较浅的层面看,智能指针是利用了一种叫做RAII(资

C++中智能指针的模板类

在C++中,智能指针是一个非常重要的概念.因为C++的类动态分配的对象不能自动释放掉,需手动调用new运算符.当程序员大意时,或程序发生异常时,或许就会发生没有手动释放内存而造成内存泄露. 智能指针的定义:就是在一个类中,存在一个指向另一个类对象的指针,并通过对指针运算符(比如:->,*)的重载,就可以实现利用当前类的对象通过指针运算符来操纵另一个类的成员(就像另一个类的指针操作一样),并且,在析构函数中定义了delete操作,借助于变量的作用域,能够实现类对象空间的自动释放. 在C++ 11中

C++中的智能指针

众所周知.C++中对堆内存的申请与释放全然由用户来控制,这就造成用户在使用的时候常常造成内存泄漏.野指针.反复释放等常见的挂掉问题,所以我们有必要提供一套机制.使得用户仅仅需申请对应的内存,不用管释放的问题,事实上这属于著名的RAII(Resource Acquisition Is Initialization)技术 .在C++中这样的技术称作"智能指针",C++中的智能指针技术越来越受到广泛应用.以下简要介绍下智能指针. 从以上描写叙述中能够看出,我们须要提供一套内存显式申请与隐式释

cocos2d智能指针 转自:http://blog.csdn.net/nxshow/article/details/44699409

智能指针在C++11的标准中已经存在了, 分别是unique_ptr,shared_ptr,weak_ptr, 其中最常用的应该是share_ptr, 它采用引用计数的方式管理内存, 当引用计数为0的时候, 自动释放内存, 但是由于shared_ptr考虑到了线程安全, 所以会存在有较大的性能损失. 所以在实时游戏开发中, 往往不会用到shared_ptr. 在cocos2d-x3.2以及更高的版本中, cocos2d-x提供了自己的智能指针方案——RefPtr, 这套方案实际上也是模仿C++1

(转)Delphi2009初体验 - 语言篇 - 智能指针(Smart Pointer)的实现

快速导航 一. 回顾历史二. 智能指针简介三. Delphi中的interface四. Delphi中智能指针的实现五. interface + 泛型 = 强类型的智能指针!六. 智能指针与集合七. 注意事项八. 总结 本随笔所有源代码打包下载 一.回顾历史 在c++中,对象可以创建在栈里,也可以创建在堆里.如: class CTestClass{public: CTestClass() { printf("Create"); } void DoPrint() {} ~CTestCla

Cocos2d-x 3.2 智能指针

Cocos2d-x 3.2:智能指针 本文转载自深入理解Cocos2d-x 3.x:内置数据结构(1)智能指针 智能指针在 C++ 11 的标准中已经存在了,分别是unique_ptr,shared_ptr,weak_ptr,其中最常用的应该是share_ptr,它采用引用计数的方 式管理内存,当引用计数为0的时候,自动释放内存,但是由于shared_ptr考虑到了线程安全,所以会存在有较大的性能损失.所以在实时游戏开发中, 往往不会用到shared_ptr. 在Cocos2d-x 3.2以及更

c++11之智能指针

在c++98中,智能指针通过一个模板“auto_ptr”来实现,auto_ptr以对象的方式来管理堆分配的内存,在适当的时间(比如析构),释放所获得的内存.这种内存管理的方式只需要程序员将new操作返回的指针作为auto_ptr的初始值即可,程序员不能显式的调用delete.如 auto_ptr(new int);    这在一定程度上避免了堆内存忘记释放造成的问题.不过auto_ptr也有一些缺点(拷贝是返回一个左值,不能调用delete[]等),所以在c++11中被废弃了.c++11标准照中

[CareerCup] 13.8 Smart Pointer 智能指针

13.8 Write a smart pointer class. A smart pointer is a data type, usually implemented with templates, that simulates a pointer while also providing automatic garbage collection. It automatically counts the number of references to a SmartPointer<T*>