• 自定义使用动态内存的类模板


    首先清楚两点:

    当类有动态分配内存的对象时,运行系统只销毁对象而不销毁内存(导致内存泄漏)---自定义析构函数

    对于动态分配内存的类,初始化(复制)和赋值的默认版本不能正确管理内存 ---自定义复制函数和赋值操作符

    考虑一个类有两个成员,几个静态分配内存的成员a,一个动态分配内存的指针成员p,p指向一个动态分配的内存,存储值b

    两个类对象m,n

    m=n 默认的操作是 m.a=n.a   m.p=n.p

    但是由于p是一个指针,这样原先m.p的指针指向的内存将没有指针指向,同时内存依然存在,导致内存泄漏

    复制也会出现类似的问题。

    一般含有动态分配内存的对象的类,都有指针成员,但是复制或赋值时,默认的版本会复制指针本身,而通常不希望这样,而是复制指针指向的对象

    这就需要自定义复制函数和复制操作符

    示例代码并复习自定义类模板的内容:

     1 #include <iostream>
     2 using namespace std;
     3 
     4 template <typename T>
     5 class dynamicClass
     6 {
     7 public:
     8   dynamicClass(const T&,const T&);
     9   dynamicClass(const dynamicClass<T>&);
    10   dynamicClass<T>& operator=(const dynamicClass<T>&);
    11   friend ostream& operator<<(ostream &os,const dynamicClass<T> &rhs)
    12   {
    13     os << rhs.member1 << " " << rhs.member2 << ":" << *rhs.member2;
    14     return os;
    15   }
    16   ~dynamicClass();
    17 private:
    18   T member1;
    19   T *member2;
    20 };
    21 
    22 template <typename>
    23 dynamicClass<T>::dynamincClass(const T &m1,const T &m2):member1(m1)
    24 {
    25   member2 = new T(m2);
    26 }
    27 
    28 template <typename T>
    29 dynamicClass<T>::dynamicClass(const dynamiicClass<T> &rhs):member1(rhs.member1)
    30 {
    31   member2 = new T(*rhs.member2);
    32 }
    33 
    34 template <typename T>
    35 dynamicClass<T>& dynamicClass<T>::opeartor=(const dynamicClass<T> &rhs)
    36 {
    37   member1 = rhs.member1;
    38   *member2 = *rhs.member2;
    39   return *this;
    40 }
    41 
    42 template <typename T>
    43 dynamicClass<T>::~dynamincClass()
    44 {
    45   delete member2;
    46 }
  • 相关阅读:
    python之 json里字典中的value去重
    matlab 中出现的错误 原因及解决办法
    利用matlab将二进制小数转换为十进制小数
    Git学习笔记
    关于升级OSX10.10 Yosemite后Matlab无法启动的解决办法
    编译macvim报错的macvim failed to build on 10.9 because of x11解决办法
    安装pydelicious遇到的一些问题
    用VerilogHDL编写的可调占空比的PWM波形设计
    精确了13倍是什么意思?
    知乎周刊之程序人生概要
  • 原文地址:https://www.cnblogs.com/buptlyn/p/3608767.html
Copyright © 2020-2023  润新知