C++ 深浅拷贝 01

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;
}
发布了100 篇原创文章 · 获赞 6 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43903378/article/details/103809495