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