zoukankan      html  css  js  c++  java
  • 异常安全的赋值运算符函数

    异常安全的赋值运算符函数

    参考《剑指offer》
    异常安全的赋值运算符函数,可以避免由于内存空间不足,导致new或malloc给m_pData分配内存时分配失败的情况。方法是:创建一个临时实例,再交换临时实例的数据与原来的实例。

    #include<cstring>
    #include<cstdio>
    
    class CMyString
    {
    public:
        CMyString(char* pData = nullptr);
        CMyString(const CMyString& str);
        ~CMyString(void);
    
        CMyString& operator = (const CMyString& str);
    
        void Print();
          
    private:
        char* m_pData;
    };
    
    CMyString::CMyString(char *pData)
    {
        if(pData == nullptr)
        {
            m_pData = new char[1];
            m_pData[0] = '';
        }
        else
        {
            int length = strlen(pData);
            m_pData = new char[length + 1];
            strcpy(m_pData, pData);
        }
    }
    
    CMyString::CMyString(const CMyString &str)
    {
        int length = strlen(str.m_pData);
        m_pData = new char[length + 1];
        strcpy(m_pData, str.m_pData);
    }
    
    CMyString::~CMyString()
    {
        delete[] m_pData;
    }
    
    /*********************************非异常安全版本************************************/
    /*
    CMyString& CMyString::operator = (const CMyString& str)
    {
        if(this == &str)
            return *this;
    
        delete []m_pData;
        m_pData = nullptr;
    
        m_pData = new char[strlen(str.m_pData) + 1];
        strcpy(m_pData, str.m_pData);
    
        return *this;
    }
    */
    /*************************************************************************************/
    
    /*********************************异常安全版本************************************/
    CMyString& CMyString::operator = (const CMyString& str)
    {
        if (this != &str)
        {
            CMyString newCopy(str);            // 如果此时new抛出异常,则也不会影响this中动态内存
            char* pDataTemp = newCopy.m_pData; // 将新对象中的动态内存内容赋值临时变量
            newCopy.m_pData = this->m_pData;   // 将原this中的动态内存内容赋值给新对象,这样跳出if后将释放newCopy内存,也即释放了this中的原动态内存
            this->m_pData = pDataTemp;         // 赋值给this对象中的动态内存
        }
    
        return *this;
    }
    /*************************************************************************************/
    
    // ====================测试代码====================
    void CMyString::Print()
    {
        printf("%s", m_pData);
    }
    
    void Test1()
    {
        printf("Test1 begins:
    ");
    
        char* text = "Hello world";
    
        CMyString str1(text);
        CMyString str2;
        str2 = str1;
    
        printf("The expected result is: %s.
    ", text);
    
        printf("The actual result is: ");
        str2.Print();
        printf(".
    ");
    }
    
    // 赋值给自己
    void Test2()
    {
        printf("Test2 begins:
    ");
    
        char* text = "Hello world";
    
        CMyString str1(text);
        str1 = str1;
    
        printf("The expected result is: %s.
    ", text);
    
        printf("The actual result is: ");
        str1.Print();
        printf(".
    ");
    }
    
    // 连续赋值
    void Test3()
    {
        printf("Test3 begins:
    ");
    
        char* text = "Hello world";
    
        CMyString str1(text);
        CMyString str2, str3;
        str3 = str2 = str1;
    
        printf("The expected result is: %s.
    ", text);
    
        printf("The actual result is: ");
        str2.Print();
        printf(".
    ");
    
        printf("The expected result is: %s.
    ", text);
    
        printf("The actual result is: ");
        str3.Print();
        printf(".
    ");
    }
    
    int main(int argc, char* argv[])
    {
        Test1();
        Test2();
        Test3();
    
        return 0;
    }
  • 相关阅读:
    2016 多校赛3 A 水 B 期望,规律 C 各种博弈 J 物理题,积分 K 暴力,水
    2016 多校赛4 A dp,KMP E(待补) F(待补) J LIS变形,套路 K 水 L 水
    2016-12-27 spoj MINSUB 二分,单调栈 spoj INTSUB 思维
    sqlmap用户手册
    用PROXYCHAINS实现SSH全局代理
    linux之sort用法
    PHP 变量定义及使用
    查漏补缺
    总结2
    最近
  • 原文地址:https://www.cnblogs.com/xl-cnblog/p/14881021.html
Copyright © 2011-2022 走看看