1.C++中成员对象如果指向了堆内存的空间,如果这时候使用了系统提供的拷贝构造函数(默认浅拷贝),会造成内存重复释放的问题,导致程序down掉,解决办法修改默认的拷贝构造函数,也给新的对象需要堆内存的成员变量去开启一个堆内存, 避免堆内存重复释放
#include "pch.h"
#include <iostream>
using namespace std;
class Person {
public:
char *m_name;
int m_age;
Person(const char *name, int age) {
m_name = (char *)malloc(strlen(name) + 1);
strcpy(m_name, name);
m_age = age;
}
Person(const Person &p) {
// m_name = p.m_name; // 系统提供的浅拷贝, 会引起内存重复释放
m_age = p.m_age;
m_name = (char *)malloc(strlen(p.m_name) + 1);//修改为深拷贝
strcpy(m_name, p.m_name);
}
~Person() {
if (m_name!=NULL) {
cout << "person xigou" << endl;
free(m_name);
m_name = NULL;
}
}
};
void test1() {
Person p1("Tom", 18); // 这个Tom也是分配在常量区吗? 是的,
Person p2(p1); // 调用拷贝构造函数
}
int main()
{
//test1();
//Person * p3 = (Person *)malloc(sizeof(Person)); //着重看下这种内存分配方式 ,整个对象分配在了 堆内存, p3这个指针变量在栈内存,
//p3->m_age = 18;
//p3->m_name = const_cast<char *>("nihao"); // 这个nihao也是分配在了常量吗? 是的
//free(p3);
return 0;
}