zoukankan      html  css  js  c++  java
  • 自定义使用动态内存的类模板

    首先清楚两点:

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

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

    考虑一个类有两个成员,几个静态分配内存的成员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 pytesseract模块,报错
    CSS清除浮动_清除float浮动
    CSS中@import与link的具体区别
    js substr和substring的区别
    WebStorm 自定义字体+颜色+语法高亮+导入导出用户设置
    Jquery中的重置
    table标签中thead、tbody、tfoot的作用
    下拉列表框的几个属性
    使用GDI绘制文本
    使用GDI绘制一条直线
  • 原文地址:https://www.cnblogs.com/buptlyn/p/3608767.html
Copyright © 2011-2022 走看看