STL教程9-容器元素深拷贝和浅拷贝问题

浅拷贝问题的一个案例

定义一个类
下面有个指针成员,这样容易出现浅拷贝问题

class Person {
public:
	char* name;
	int age;
public:
	Person(const char * name,int age) {
		this->name = new char[strlen(name) + 1];
		strcpy(this->name, name);
		this->age = age;
	}
	~Person() {
		if (this->name != NULL) {
			delete[] this->name;
		
		}
	}

};

然后定义一个类的对象,把它放到容器里面

int main() {
	const char* a = "name";
	Person p(a, 20);
	vector<Person>v;
	v.push_back(p);

}

然后直接报错
在这里插入图片描述
原因在于外面的对象和vector里面对象的name指针都指向了同一块内存,在程序结束后,外面对象开始析构,析构完成后vector里面的元素也要析构, 这样同一块内存就析构了两次,就会发生错误
在这里插入图片描述

解决方法

在这里插入图片描述
修改后的代码

class Person {
public:
	char* name;
	int age;
public:
	Person(const char * name,int age) {
		this->name = new char[strlen(name) + 1];
		strcpy(this->name, name);
		this->age = age;
	}
	Person(const Person& p) {
		this->name = new char[strlen(p.name) + 1];
		strcpy(this->name, p.name);
		this->age = p.age;
	}
	Person& operator=(const Person& p) {
		if (this->name != NULL) {
			delete[] this->name;
		}
		this->name = new char[strlen(p.name) + 1];
		strcpy(this->name, p.name);
		this->age = p.age;
		return *this;
	}
	~Person() {
		if (this->name != NULL) {
			delete[] this->name;
		}
	}

};

重新运行没有崩溃
在这里插入图片描述

STL容器共性机制(重要)

STL所有容器提供的都是值语意,而非引用语意。容器执行插入元素操作时,内部内部实施了拷贝工作,将我们要插入的元素在拷贝一份放入到容器汇总,而不是将原数据元素直接放进容器中,因此我们提供的元素必须能够被拷贝(如果有指针需要自己去构造)。

最后

这里使用strcpy会出现问题,报错

严重性	代码	说明	项目	文件	行	禁止显示状态
错误	C4996	'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.	map	D:\store\server\leetcode\map\源.cpp	13	

只需要在头部加上

#define _CRT_SECURE_NO_WARNINGS
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贪睡的蜗牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值