C++ STL 如何安全的将一个含有指针变量的类对象放在容器中? 避免浅拷贝问题

时间:2022-04-25 21:31:46
深拷贝浅拷贝问题

C++ STL 如何安全的将一个含有指针变量的类对象放在容器中? 避免浅拷贝问题

单纯的使用系统自带的拷贝构造函数会造成两个对象所指内存空间为同一块,在析构的时候一块内存空间就会被析构两次,然后就出现程序的相应中断

解决办法:
1 重写拷贝构造函数
2 重载 = 号操作符

#include<iostream>

using namespace std;

#include"vector"

class Student{

public:
	Student(char *m_name, int m_age)   //有参数的构造函数
	{
		name = new char[strlen(m_name) + 1];  //先分配内存
		strcpy(name, m_name);   //赋值

		age = m_age;
	}

	Student(const Student &obj)    //拷贝构造函数
	{
		name = new char[strlen(obj.name) + 1];
		strcpy(name, obj.name);   //赋值
		age = obj.age;
	}

	//实现  t3 = t2 = t1  this指向t2
	Student& operator = (const Student &obj)   //重载等号(=)操作符 并且返回一个类的引用
	{
		//先释放t2原本的内存空间

		if (this->name != NULL)
		{
			delete[] name;
			name = NULL;
			age = 0;
		}

		//根据t1 开辟新的内存空间
		name = new char[strlen(obj.name) + 1];

		//copy值
		strcpy(name, obj.name);   //赋值
		age = obj.age;

		//返回一个引用

		return *this;

	}


	~Student() //析构函数
	{
		if (name!= NULL)  //如果年龄不为空指针就释放该内存空间
		{
			delete [] name;
			name = NULL;
			age = 0;
		}
	}
public:
	char * name;
	int age;
};

void exp()
{
	Student s1("李二蛋",22);
	vector<Student> v1;
	v1.push_back(s1);
	cout << v1.back().name << endl;

}

int main()
{
	exp();
	system("pause");
	return 0;
}