没有重写“复制构造函数”或重载赋值运算符所引起的“内存重复释放”的错误

本文解析了如何通过C++的构造函数和析构函数实现MyString类的对象初始化,重点讨论了字符串对象的动态分配与释放。通过实例展示了将const char*传递给MyString构造函数的过程,以及临时对象和析构后的内存清理问题。
摘要由CSDN通过智能技术生成
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
class MyString {
    char* p;
public:
    MyString(const char* s) {
        cout << "构造函数被调用"  << s << endl;
        if (s) {
            p = new char[strlen(s) + 1];
            strcpy_s(p, strlen(s)+1, s);
        }
        else
            p = NULL;

    }
    ~MyString() { cout << "析构函数被调用" << p << endl; if (p) delete[] p; cout << "完成" << endl; }

};
int main()
{
    const char* w1 = "xiejunyan", *w2 = "nmd";
    MyString s1(w1);
    s1 = w2;
}

在s1 = w2这句中, 编译器发现“没有赋值运算符的重载”,它认为,不能直接把const char*对象赋值给MyString对象,但是它发现可以用const char*来构造一个MyString对象,于是生成一个临时的MyString对象,开辟了“土地1”,放有w2的拷贝;

接着编译器调用了“本身的复制构造函数”,另s1的p也指向"土地1";

随后临时的MyString对象被析构,“土地1”消失;

最后s1想析构,可是却发现自己的p指向的“土地1”已经消失了;

构造函数被调用xiejunyan
构造函数被调用nmd
析构函数被调用nmd
完成
析构函数被调用葺葺葺葺

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值