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;
    }

  • 相关阅读:
    属性 Owner 不可用于 数据库...
    DHCP Client 服务无法启动,错误代码5:访问被拒绝
    删除域控中不活动的计算机
    在VMWare下LINUX中安装VMTool及共享文件夹
    ID 13508
    系统时间同步服务器地址收集
    windows 2003 登陆框 黑色解决办法
    linux下限制su权限
    linux screen + vim + taglist +ctags 使用
    gmail要求启用ActiveX控件,以及人人网没法分享的问题
  • 原文地址:https://www.cnblogs.com/dongjian16/p/7086734.html
Copyright © 2011-2022 走看看