当前位置:网站首页>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
边栏推荐
- Use typora to draw flow chart, sequence diagram, sequence diagram, Gantt chart, etc. for detailed explanation
- MATLAB提取不規則txt文件中的數值數據(簡單且實用)
- Balance between picture performance of unity mobile game performance optimization spectrum and GPU pressure
- Illustrated network: what is virtual router redundancy protocol VRRP?
- Solve undefined reference to`__ aeabi_ Uidivmod 'and undefined reference to`__ aeabi_ Uidiv 'error
- How to become a senior digital IC Design Engineer (1-5) Verilog coding syntax: operand
- R语言使用原生包(基础导入包、graphics)中的hist函数可视化直方图(histogram plot)
- How to clean up v$rman_ backup_ job_ Details view reports error ora-02030
- C language utf8toutf16 (UTF-8 characters are converted to hexadecimal encoding)
- 活动预告 | 直播行业“内卷”,以产品力拉动新的数据增长点
猜你喜欢

After using the thread pool for so long, do you really know how to reasonably configure the number of threads?

How to get started embedded future development direction of embedded

Summary of interview questions (2) IO model, set, NiO principle, cache penetration, breakdown avalanche

聊聊Flink框架中的状态管理机制

LeetCode 46:全排列

Encapsulate a koa distributed locking middleware to solve the problem of idempotent or repeated requests

高精度室内定位技术,在智慧工厂安全管理的应用

Numpy np.max和np.maximum实现relu函数
![[OBS] configFile in ini format of OBS](/img/b2/0b130cee6ea884557a30e4b408f49e.png)
[OBS] configFile in ini format of OBS

Résumé des questions d'entrevue (2) Modèle io, ensemble, principe NiO, pénétration du cache, avalanche de rupture
随机推荐
CSRF
Kibana~Kibana的安装和配置
One hot code
Asyncio warning deprecationwarning: there is no current event loop
How should intermediate software designers prepare for the soft test
Balance between picture performance of unity mobile game performance optimization spectrum and GPU pressure
repo ~ 常用命令
软考中级软件设计师该怎么备考
How to get started embedded future development direction of embedded
How to become a senior digital IC Design Engineer (1-2) Verilog coding syntax: Verilog 1995, 2001, 2005 standards
R语言使用data.table包进行数据聚合统计计算滑动窗口统计值(Window Statistics)、计算滑动分组中位数(median)并合并生成的统计数据到原数据集中
一文搞懂Go语言Context
AMS series - application startup process
How to make others fear you
导师对帮助研究生顺利完成学业提出了20条劝告:第一,不要有度假休息的打算.....
CSRF
Solve undefined reference to`__ aeabi_ Uidivmod 'and undefined reference to`__ aeabi_ Uidiv 'error
C language log base zlog basic use
[OBS] configFile in ini format of OBS
Multi dimensional monitoring: the data base of intelligent monitoring