C++管理指针成员

1、C++中一般采用下面三种方法之一管理指针成员:

(1)指针成员采取常规行为。这样的类具有指针的所有缺陷:具有指针成员且使用默认复制构造函数和赋值操作符,无法避免悬垂指针(两个对象的指针成员指向同一内存,删除了其中一个指针指向的内存时,另一个指针将不再指向有效的内存空间)。

(2)类可以实现所谓的"智能指针"行为。引入计数类,智能指针类将一个计数器与类的对象相关联。使用计数跟踪该类有多少个对象共享同一指针。当计数为0时,删除对象。

(3)类采取值行为。采用重载的复制构造函数、赋值操作符和析构函数。

2、指针成员采取常规行为示例:两个指针指向同一块内存,会引起不可预料的后果

  1. #include "stdafx.h"
  2. #include <string.h>
  3. #include <iostream.h>
  4. class HasPtr
  5. {
  6. public:
  7. HasPtr(int *p,int i):ptr(p),val(i){}
  8. int *get_ptr()const{return ptr;}
  9. int get_val()const{return val;}
  10. void set_ptr(int *p){ptr=p;}
  11. void set_val(int i){val=i;}
  12. int get_ptr_val()const{return *ptr;}
  13. void set_ptr_val(int val)const{*ptr=val;}
  14. private:
  15. int *ptr;
  16. int val;
  17. };
  18. int main(int argc, char* argv[])
  19. {
  20. int *p=new int(10);
  21. cout<<p<<endl;
  22. HasPtr ptr(p,10);
  23. cout<<ptr.get_ptr()<<endl;
  24. delete p;
  25. cout<<ptr.get_ptr_val()<<endl;  //p和ptr中的指针指向同一对象。删除该对象后,ptr中的指针不再指向有效的对象。
  26. return 0;
  27. }

3、"智能指针"行为示例:注意构造函数

  1. #include "stdafx.h"
  2. #include <string.h>
  3. #include <iostream.h>
  4. class HasPtr;
  5. //计数类U_Ptr所有成员均为private,将HasPtr设置为计数类的友元类,使其可以访问U_Ptr的成员
  6. class U_Ptr
  7. {
  8. friend class HasPtr;
  9. int *ip;
  10. size_t use;
  11. U_Ptr(int *p):ip(p),use(1){}
  12. ~U_Ptr()
  13. {
  14. delete ip;
  15. }
  16. };
  17. class HasPtr
  18. {
  19. public:
  20. HasPtr(int *p,int i):ptr(new U_Ptr(new int(*p))),val(i){} //构造函数,创建新的U_Ptr对象
  21. HasPtr(const HasPtr &orig):ptr(orig.ptr),val(orig.val){++ptr->use;} //复制构造函数,计数加1
  22. HasPtr& operator=(const HasPtr &rhs)  //赋值操作符,左操作数计数减1,右操作数计数加1,如果左操作数减至0,则删除左操作数指向的对象
  23. {
  24. if (this!=&rhs)
  25. {
  26. ++rhs.ptr->use;
  27. if(--ptr->use==0)
  28. delete ptr;
  29. ptr=rhs.ptr;
  30. val=rhs.val;
  31. }
  32. return *this;
  33. }
  34. ~HasPtr() //析构函数,计数减1,如果计数减至0,就删除对象
  35. {
  36. if (--ptr->use==0)
  37. {
  38. delete ptr;
  39. }
  40. }
  41. int *get_ptr()const{return ptr->ip;}
  42. int get_val()const{return val;}
  43. void set_ptr(int *p){ptr->ip=p;}
  44. void set_val(int i){val=i;}
  45. int get_ptr_val()const{return *ptr->ip;}
  46. void set_ptr_val(int val){*ptr->ip=val;}
  47. private:
  48. U_Ptr *ptr;
  49. int val;
  50. };
  51. int main(int argc, char* argv[])
  52. {
  53. int *p=new int(10);
  54. cout<<p<<endl;
  55. HasPtr ptr(p,10);
  56. cout<<ptr.get_ptr()<<endl;        //两指针指向同一块内存
  57. cout<<ptr.get_ptr_val()<<endl;
  58. delete p;
  59. return 0;
  60. }

4、定义值型类:三法则(赋值操作符、复制构造函数、析构函数)

  1. #include <string.h>
  2. #include <iostream.h>
  3. class HasPtr
  4. {
  5. public:
  6. HasPtr(int *p,int i):ptr(new int(*p)),val(i){} //构造函数
  7. HasPtr(const HasPtr &orig):ptr(new int(*orig.ptr)),val(orig.val){} //复制构造函数
  8. HasPtr& operator=(const HasPtr &rhs)  //赋值操作符
  9. {
  10. if (this!=&rhs)
  11. {
  12. ptr=new int(*rhs.ptr);
  13. val=rhs.val;
  14. }
  15. return *this;
  16. }
  17. ~HasPtr(){delete ptr;}  //析构函数
  18. int *get_ptr()const{return ptr;}
  19. int get_val()const{return val;}
  20. void set_ptr(int *p){ptr=p;}
  21. void set_val(int i){val=i;}
  22. int get_ptr_val()const{return *ptr;}
  23. void set_ptr_val(int val)const{*ptr=val;}
  24. private:
  25. int *ptr;
  26. int val;
  27. };
  28. int main(int argc, char* argv[])
  29. {
  30. int *p=new int(10);
  31. cout<<p<<endl;
  32. HasPtr ptr(p,10);
  33. cout<<ptr.get_ptr()<<endl;       //p与ptr的指针不是指在同一块内存,但是所指向的对象内容是一样的
  34. delete p;
  35. cout<<ptr.get_ptr_val()<<endl;
  36. return 0;
  37. }

版权声明:本文为博主http://www.zuiniusn.com原创文章,未经博主允许不得转载。

时间: 2024-10-10 10:31:33

C++管理指针成员的相关文章

C++ Primer 学习笔记_57_类与数据抽象 --管理指针成员

复制控制 --管理指针成员 引言: 包含指针的类需要特别注意复制控制,原因是复制指针时只是复制了指针中的地址,而不会复制指针指向的对象! 将一个指针复制到另一个指针时,两个指针指向同一对象.当两个指针指向同一对象时,可能使用任一指针改变基础对象.类似地,很可能一个指针删除了一对象时,另一指针的用户还认为基础对象仍然存在.指针成员默认具有与指针对象同样的行为. 大多数C++类采用以下三种方法之一管理指针成员: 1)指针成员采取常规指针型行为:这样的类具有指针的所有缺陷但无需特殊的复制控制! 2)类

13.5. 管理指针成员的13.5.2. 定义值型类 方法

#include <iostream> #include<string> #include<set> using namespace std; //定义值类型 /* 复制构造函数不再复制指针,它将分配一个新的 int 对象,并初始化该对 象以保存与被复制对象相同的值.每个对象都保存属于自己的 int 值的不同副 本.因为每个对象保存自己的副本,所以析构函数将无条件删除指针. 赋值操作符不需要分配新对象,它只是必须记得给其指针所指向的对象赋新 值,而不是给指针本身赋值 换

C++ 带有指针成员的类处理方式

在一个类中,如果类没有指针成员,一切方便,因为默认合成的析构函数会自动处理所有的内存.但是如果一个类带了指针成员,那么需要我们自己来写一个析构函数来管理内存.在<<c++ primer>> 中写到,如果一个类需要我们自己写析构函数,那么这个类,也会需要我们自己写拷贝构造函数和拷贝赋值函数. 析构函数: 我们这里定义一个类HasPtr,这个类中包含一个int 类型的指针.然后定义一个析构函数,这个函数打印一句话. HasPtr.h 类的头文件 1 #pragma once 2 #if

struct的初始化,拷贝及指针成员的使用技巧

struct是C中重要的ADT.但是在一般讲C的书中,往往只介绍了struct的定义.顺序初始化及位域. 本文将笔者曾经用到的.看到的知识点罗列出来,与大家分享. 为了方便后面的介绍,先定义一个struct类型:         struct User         {             int id;             //id             char name[100];     //user name             char *home;        

15.含有指针成员的类的拷贝(copy constructor)

http://zhedahht.blog.163.com/blog/static/25411174200722710364233/ http://www.cnblogs.com/t427/archive/2012/08/10/2633133.html http://blog.csdn.net/gamecreating/article/details/5382902 http://www.cppblog.com/xczhang/archive/2008/01/21/41569.html 题目:下面

C++11 指针成员与拷贝构造(浅拷贝与深拷贝)

[1]浅拷贝 一直以来,设计一个类,个人认为,最能体现水平的地方在于:类中含有指针成员变量. 如下一个典型的浅拷贝示例: 1 #include <iostream> 2 using namespace std; 3 4 class HasPtrMem 5 { 6 public: 7 HasPtrMem() : d(new int(0)) 8 {} 9 ~HasPtrMem() 10 { 11 delete d; 12 d = nullptr; 13 } 14 15 int* d; 16 };

【objective-c】内存管理中成员变量声明参数的一些总结

1>set方法内存管理的相关参数 retain //release旧值,retain新值 (适用于OC对像类型) assign //直接赋值 (默认的参数,适用于非OC对象) copy //release旧值,copy新值 2>是否生成setter或者getter方法 readwrite //同时生成setter和getter方法 readonly //只生成getter方法 3>多线程管理 nonatomic //性能高 atomic //性能低

智能指针 与 oc中的指针

智能指针 与 oc中的指针 智能指针的原理及实现 当类中有指针成员时,一般有两种方式来管理指针成员:一是采用值型的方式管理,每个类对象都保留一份指针指向的对象的拷贝:另一种更优雅的方式是使用智能指针,从而实现指针指向的对象的共享. 智能指针(smart pointer)的一种通用实现技术是使用引用计数(reference count).智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象共享同一指针. 每次创建类的新对象时,初始化指针并将引用计数置为1:当对象作为另一对象的副

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

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