a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 134|回复: 2

[C语言] 2011年计算机等级考试二级C辅导实例编程(16)

[复制链接]
发表于 2012-7-31 21:48:08 | 显示全部楼层 |阅读模式
  实现一个简单的智能指针# u/ ~, D1 X+ C; C+ w! @& p
  01// helloworld.cpp : 定义控制台应用程序的入口点。
& H' O# m, I$ v. Y! i+ i6 V- M' l  02//! S  a% F9 k' P
  030 q0 G: O# `5 X0 I8 C0 q  Z' O' @
  04#include "stdafx.h"
+ `9 a0 T+ O6 S+ x  05#include8 m) T) p6 M8 \* p$ j( R
  06using namespace std;2 X, o: i( \3 m1 G8 m  v2 [
  07) I3 z5 ]& ?1 `/ g: B
  08//指针类
8 u/ C5 C  p. y# a, X8 Z6 Z' \  09class I_Pointer{0 x0 _6 d  b! s. @9 }) i& p( g
  10private:
8 _3 h. g. b. w2 p; T  O3 d; `  11 int ref_count;; a. Y2 r, W/ x9 W% t- T! k
  12 int *p;" `8 P9 k& u/ \8 F! Z$ O3 j
  13 I_Pointer(int *p): p(p), ref_count(1){}; //构造函数
; R2 U) C+ N8 f! y. H- H6 y  14 ~I_Pointer(){9 p- q4 x/ F5 y! S. W

. z* ?9 x' N4 }- A' I; z# O  15 cout
回复

使用道具 举报

 楼主| 发表于 2012-7-31 21:48:09 | 显示全部楼层

2011年计算机等级考试二级C辅导实例编程(16)

 24 I_Pointer *ptr; //指针成员  25 //减少引用计数
$ f3 }7 I& R: z  Q' b: r+ G  26 void release_ref_count(){" X$ r0 W  s8 w9 J/ P/ D8 c

8 g- L1 |, ^- ~  27 cout
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-31 21:48:10 | 显示全部楼层

2011年计算机等级考试二级C辅导实例编程(16)

68 }  698 t+ G( O* S* ^( W) s
  70 void set_ptr(int *ptr){
& Q3 _- F- H/ a8 e% ~% a  71 if (ptr != (this->ptr->p)){
% r7 ~# X  H+ u% f  z  72 this->ptr->p = ptr;
3 R& ^! C! I, r, \& o  73 }2 m' T& O  x9 o6 c& Z$ k
  74 }
% j# r$ `) ~% ~; F# D& T: l  75 int* get_ptr(){
+ _7 s( f/ X2 H( {+ G$ o  76 return ptr->p;
) E2 a; V9 [: g  u  X) [! g  77 }
( r% c2 t/ ^8 |9 n7 ^  78};
, I5 ^6 ?7 c2 ~' S; i. P  791 c% W# i' h+ o. G
  80void test(){( K4 O: Y/ ^% O+ \& N
  81 int i = 0;; `/ G# j0 r$ t* O+ |, i
  82 Has_Ptr hp(&i);
+ K  F8 c6 J/ y# U  83 int j = 1;
5 O# ^" P& l# d1 y# a  84 Has_Ptr hp1(&j);" }$ R, }- L; p
  85 hp1 = hp;
$ K9 g: _5 s* p0 S/ Q7 B# X' G  86}! O% A* c0 x1 _
  87int _tmain(int argc, _TCHAR* argv[])
* J  I+ ^# G- m  88{
6 B7 I# O$ h. U3 K% |  s0 z  89 test();' k. e5 l' \( \4 a: Q8 r
  90 return 0;
3 P/ C9 H( ^1 M' U' P* h  91}! T8 f- Y: q" X; A
  当一个类的成员里面有指针的时候,使用默认拷贝构造函数的时候就会造成多个对象管理同一块内存
: Z3 I7 `, Y. B* Q  这样带来的后果就是,如果任意一个对象释放了这一块内存,那么其他的对象再来操作这块内存的时候就会发生预料不到的结果。4 N$ o" d4 g/ q1 }$ V+ y
  为了避免对象中保存野指针从而引发的错误,提出了智能指针, 它能实现多个对象共享内存的自释放。
" T  @+ i/ b; b5 u8 t4 q  其实这种实现有点类似于delphi中的接口,到处传来传去的,最后自释放,就是因为接口有引用计数,当引用计数为1的时候就把对象释放掉。0 H) |0 p1 v1 m8 v* c
  C++中这种实现(C++ Primer书上借鉴来的),有几个比较巧妙的地方
1 M- m( b* D4 V9 m5 `1 p& G8 O  ·Has_Ptr这个类其实是想保存一个int *的指针,为了避免悬垂指针的出现,我们使用了 I_Pointer这个类把悬垂指针包了一下,因此在Has_Ptr这个类的Public接口中不会出现I_Pointer,只会出现int *4 p3 \- I! M* T: ?7 t  S* S0 r- ]
  ·事实上也不能出现I_Pointer, 因为Pointer的构造函数定义成Private,不允许在外面构造,只能在friend类中构造,I_Pointer是专门为Has_Ptr实现的8 j9 g: s- B$ O! D/ |3 D( F6 A
  ·要记住三元组(拷贝构造,赋值操作,析构),当其中一个需要有特殊操作的时候,其他的也需要有特殊操作,这个要形成定势思维。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-16 03:48 , Processed in 0.168826 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表