1.通过C++的析构函数,自动释放堆内存数据,达到内存自动释放的目的。
2.通过C++的拷贝构造函数,容器中的数据属于深拷贝,完成对象自动申请内存与自动释放内存。
3.通过重载赋值运算符,完成两个对象之间的赋值规则制定。
#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
class Message{
public:
//默认构造函数
Message()
{
cout<<"Message()"<<endl;
dataLen = 0;
buf = nullptr;
}
//默认析构函数
~Message()
{
cout<<"~Message()"<<endl;
if(buf!=nullptr)
{
delete[] buf;
buf=nullptr;
cout<<this<<":delete"<<endl;
}
}
//构造函数创建消息
Message(int len,char *ptr)
{
cout<<"Message(int len,char *ptr)"<<endl;
dataLen = len;
buf = new char[len];
memcpy(buf,ptr,len);
cout<<this<<":new"<<endl;
}
//拷贝构造函数
Message(const Message &msg)
{
cout<<"Message(const Message &msg)"<<endl;
dataLen = msg.dataLen;
buf = new char[dataLen];
memcpy(buf,msg.buf,dataLen);
cout<<this<<":new"<<endl;
}
//重载赋值语句
Message& operator=(const Message& other)
{
cout<<"Message operator=(const Message&other)"<<endl;
// 自赋值检查
if (this == &other) return *this;
// 释放或重置当前对象拥有的资源(如果有的话)
dataLen = other.dataLen;
if(buf != nullptr)
{
delete[] buf;
buf=nullptr;
cout<<this<<":delete"<<endl;
}
buf = new char[dataLen];
memcpy(buf, other.buf, dataLen);
cout<<this<<":new"<<endl;
// 返回当前对象的引用
return *this;
}
public:
int dataLen;
char *buf;
};
int main()
{
char buf[5]={"1234"};
//1.测试消息自动申请和自动释放动态内存
Message msg1(5,buf);
// cout<<msg1.buf<<endl;
//2.测试一个对象等于另外一个对象
Message msg2(4,buf);
msg2 = msg1;
// cout<<msg2.buf<<endl;
//3.测试容器中存放动态数据,调用拷贝构造函数
vector<Message> vec;
vec.push_back(msg1);
vec.pop_back();
vec.push_back(msg2);
return 0;
}
4、上述的代码测试结果如下:
该测试结果表面没有内存泄漏(new和delete是匹配的)
Message(int len,char *ptr)
0x7fffc3f3d2f0:new
Message(int len,char *ptr)
0x7fffc3f3d300:new
Message operator=(const Message&other)
0x7fffc3f3d300:delete
0x7fffc3f3d300:new
Message(const Message &msg)
0x5559cd982f00:new
~Message()
0x5559cd982f00:delete
Message(const Message &msg)
0x5559cd982f00:new
~Message()
0x5559cd982f00:delete
~Message()
0x7fffc3f3d300:delete
~Message()
0x7fffc3f3d2f0:delete