zoukankan      html  css  js  c++  java
  • 拷贝构造函数内存泄漏的例子

    #include <iostream>
    //先创建后析构
    using namespace std;
    class Name {
    private:
        char *pName;
        int size;
    public:
        Name(const char *pname) {
            size = strlen(pname);
            pName = (char *)malloc(size + 1);
            strcpy(pName, pname);
        }
        Name(Name &obj) {
            //用obj初始化自己
            pName = (char *)malloc(obj.size + 1);
            strcpy(pName, obj.pName);
            size = obj.size;
        }
        ~Name() {
            cout << "开始析构..." << endl;
            if (pName != NULL) {
                free(pName);
                pName = NULL;
                size = 0;
            }
        }
        void operator=(Name &obj3) {
            cout << "测试" << endl;

        if (pName != NULL) { //如果这个if语句没有写,那么就会发生内存泄漏的事情,因为在进行operator=运算符重载时,n2 = obj2;//=号操作n2调用运算符重载,此时,n2的语句进行pName =     (char *)malloc(obj.size + 1);内存分配时,原来n2初始化时pName所指的空间将会泄漏,找不到,所以要使用这个if语句
                free(pName);
                pName = NULL;
                size = 0;
            }
            pName = (char *)malloc(sizeof(obj3.size + 1));
            strcpy(pName, obj3.pName);
            size = obj3.size;
        }
    };
    void playObj() {
        Name obj("obj1...");
        Name n2 = obj;//创建并初始化
        Name obj2("obj2...");
        n2 = obj2;//=号操作
        cout << "业务操作..." << endl;
    }
    int main() {
        playObj();
        system("pause");
        return 0;
    }

  • 相关阅读:
    MySQL数据类型2
    MySQL数据类型1
    powerdesigner使用之——从“概念模型”到“物理模型”
    javascript中click和onclick的区别
    eclipse将javaSE项目导出成可执行jar包
    配置SQLServer,允许远程连接
    VirtualBox虚拟机中安装XP系统
    fastjson 的使用总结
    idea前端页面不刷新----springboot
    后台可以用layui快速开发
  • 原文地址:https://www.cnblogs.com/dongjian16/p/7086734.html
Copyright © 2011-2022 走看看