C++一些注意点之指针成员管理

      C++类中经常含有指针,但是如何处理这个问题,本文针对<<C++ Primer>>和<<C++沉思录>>的方法进行了一点小结。本文只是浅尝辄止,深了自己都不懂了,且本文的例子漏洞百出,本文旨在总结这几种处理方法。

 

类中含有指针带来的一些问题

     设计具有指针成员的类时,类设计者必须首先需要决定的是该指针应提供什么行为。将一个指针复制到另一个指针时,两个指针指向同一个对象。当两个指针指向同一对象时,可以使用任一指针改变对象。类似地,很可能一个指针了一个对象时,另一个指针的用户还没有发现。

      通过不同的复制控制策略,可以为指针成员实现不同的行为。通常有以下五种策略(个人之见):

    (1)指针成员采取常规指针行为。这样的类具有所有指针缺限,但是不需要用户编写复制控制程序;

    (2)类采取值行为。复制的时候,另外分配空间,但是值与被复制对象一致;

    (3)采取拥有权转移。即被复制对象释放指针的引用。标准库的auto_ptr;

    (4)实现所谓的“智能指针”。共享对象,但是能防止“悬垂指针”;

    (5)“写时复制”技术。在修改的时候才去重新分配空间。

 

策略一:常规指针行为

      这种方式的赋值操作符/复制构造函数采用系统默认的,两个复制的对象共用相同的空间,这会带来一些析构时遇到的问题。

#include<iostream>
using namespace std;
 
class HasPtr{
public:
     HasPtr(int *p):ptr(p){}
     int* getPtr()const
 
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
C++智能指针的原理和实现 智能指针的原理和实现 ⼀、智能指针起因 ⼀、智能指针起因   在C++中,动态内存的管理是由程序员⾃⼰申请和释放的,⽤⼀对运算符完成:new和delete。   new:在动态内存中为对象分配⼀块空间并返回⼀个指向该对象指针;   delete:指向⼀个动态独享的指针,销毁对象,并释放与之关联的内存。   使⽤堆内存是⾮常频繁的操作,容易造成堆内存泄露、⼆次释放等问题,为了更加容易和更加安全的使⽤动态内存,C++11中引⼊了智 能指针的概念,⽅便管理堆内存,使得⾃动、异常安全的对象⽣存期管理可⾏。智能指针主要思想是RAII思想,"使⽤对象管理资源",在 的构造函数中获取资源,在的析构函数中释放资源。智能指针的⾏为似常规指针,重要的区别是它负责⾃动释放所指向的对象。   RAII是Resource Acquisition Is Initialization的简称,即资源获取就是初始化:   1.定义⼀个来封装资源的分配与释放;   2.构造函数中完成资源的分配及初始化;   3.析构函数中完成资源的清理,可以保证资源的正确初始化和释放;   4.如果对象是⽤声明的⽅式在栈上创建局部对象,那么RAII机制就会正常⼯作,当离开作⽤域对象会⾃动销毁⽽调⽤析构函数释放资 源。 ⼆、智能指针型 ⼆、智能指针型   智能指针C++11版本之后提供,包含在头⽂件<memory>中,标准命名std空间下,有auto_ptr、shared_ptr、weak_ptr、unique_ptr四 种,其中auto_ptr已被弃⽤。   :拥有严格对象所有权语义的智能指针;   :拥有共享对象所有权语义的智能指针;   :到 shared_ptr管理对象的弱引⽤;   :拥有独有对象所有权语义的智能指针。 2.1 auto_ptr   auto_ptr是通过由 new 表达式获得的对象,并在auto_ptr⾃⾝被销毁时删除该对象智能指针,它可⽤于为动态分配的对象提供异常安 全、传递动态分配对象的所有权给函数和从函数返回动态分配的对象,是⼀个轻量级的智能指针,适合⽤来管理⽣命周期⽐较短或者不会被 远距离传递的动态对象,最好是局限于某个函数内部或者是某个的内部。   声明:   template< class T > class auto_ptr;   template<> class auto_ptr<void>; // 对型void特化     成员函数:   (1) : 获得内部对象指针;   (2) :释放被管理对象的所有权,将内部指针置为空,返回内部对象指针,此指针需要⼿动释放;   (3) :销毁内部对象并接受新的对象的所有权;   (4) :从另⼀auto_ptr转移所有权;   (5) 和:访问被管理对象。   注意事项:   (1) 其构造函数被声明为explicit,因此不能使⽤赋值运算符对其赋值,即不能使⽤似这样的形式 auto_ptr<int> p = new int;   (2) auto_ptr对象所有权是独占性的,使⽤拷贝构造和赋值操作符时,会造成对象所有权的转移,被拷贝对象在拷贝过程中被修改;   (3) 基于第⼆条,因此不能将auto_ptr放⼊到标准容器中或作为容器的成员;   (4) auto_ptr不能指向数组,释放时⽆法确定是数组指针还是普通指针;   (5) 不能把⼀个原⽣指针交给两个智能指针对象管理,对其它智能指针也是如此。   auto_ptr是最早期的智能指针,在C++11 中已被弃⽤,C++17 中移除,建议使⽤unique_ptr代替auto_ptr。   简单实现: 1 template<class T> 2 class AutoPointer 3 { 4 public: 5 AutoPointer(T* ptr) 6 :mPointer(ptr){} 7 8 AutoPointer(AutoPointer<T>& other) 9 { 10 mPointer= other.mPointer; //管理权进⾏转移 11 other.mPointer= NULL; 12 } 13 14 AutoPointer& operator = (AutoPointer<T>& other) 15 { 16 if(this != &other) 17 { 18 delete mPointer; 19 mPointer = other.mPointer; //管理权进⾏转移 20 other.mPointer= NULL; 21 } 22 23 return *this; 24 } 25 26 ~AutoPointer() 27 { 28 delete mP

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值