当前位置:网站首页>STL教程9-容器元素深拷贝和浅拷贝问题
STL教程9-容器元素深拷贝和浅拷贝问题
2022-07-03 10:45:00 【贪睡的蜗牛】
浅拷贝问题的一个案例
定义一个类
下面有个指针成员,这样容易出现浅拷贝问题
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
边栏推荐
- Program process management tool -go Supervisor
- Gut | Yu Jun group of the Chinese University of Hong Kong revealed that smoking changes intestinal flora and promotes colorectal cancer (do not smoke)
- 2022-07-02: what is the output of the following go language code? A: Compilation error; B:Panic; C:NaN。 package main import “fmt“ func mai
- R语言使用data.table包进行数据聚合统计计算滑动窗口统计值(Window Statistics)、计算滑动分组中位数(median)并合并生成的统计数据到原数据集中
- Bi skills - permission axis
- phpcms 提示信息页面跳转showmessage
- Android log system
- One hot code
- Stm32hal library upgrades firmware based on flash analog U disk (detailed explanation)
- CSRF
猜你喜欢

软考中级软件设计师该怎么备考

基于turtlebot3实现SLAM建图及自主导航仿真

Résumé des questions d'entrevue (2) Modèle io, ensemble, principe NiO, pénétration du cache, avalanche de rupture

2022 northeast four provinces match VP record / supplementary questions

Google Earth engine (GEE) - ghsl global population grid dataset 250 meter resolution

How to clean up v$rman_ backup_ job_ Details view reports error ora-02030
![[OBS] configFile in ini format of OBS](/img/b2/0b130cee6ea884557a30e4b408f49e.png)
[OBS] configFile in ini format of OBS

Cadence background color setting

Abandon the Internet after 00: don't want to enter a big factory after graduation, but go to the most fashionable Web3

Gut | Yu Jun group of the Chinese University of Hong Kong revealed that smoking changes intestinal flora and promotes colorectal cancer (do not smoke)
随机推荐
CSRF
Nestjs配置服务,配置Cookie和Session
C语言 AES加解密
[VTK] vtkPolydataToImageStencil 源码解读
The LINQ expression node type 'ArrayIndex' is not supported in LINQ to Entities
Reading notes: heart like Bodhi, Cao Dewang
活动预告 | 直播行业“内卷”,以产品力拉动新的数据增长点
Numpy np. Max and np Maximum implements the relu function
C language utf8toutf16 (UTF-8 characters are converted to hexadecimal encoding)
2. Hal hardware abstraction layer
1. Hal driven development
ORACLE进阶(一) 通过EXPDP IMPDP命令实现导dmp
uniapp实现点击加载更多
LeetCode 46:全排列
P3250 [HNOI2016] 网络 + [NECPC2022] F.Tree Path 树剖+线段树维护堆
R语言使用aggregate函数计算dataframe数据分组聚合的均值(sum)、不设置na.rm计算的结果、如果分组中包含缺失值NA则计算结果也为NA
Excel表格转到Word中,表格不超边缘纸张范围
Execute kubectl on Tencent cloud container service node
Kibana~Kibana的安装和配置
C language log base zlog basic use