求教:vector容器的push_back是深拷贝还是浅拷贝?

csdnGuoYuying 2020-02-07 08:42:31
class Person{
public:
char* name;
int age;
public:
Person(char* n, int a){
this->name = new char[strlen(n)+1];
strcpy(name, n);
age = a;
}
~Person(){
if(name){
cout << "析构:地址:" << &name << endl;
delete [] name;
}
}
};
int main(){
Person p("aaa", 20);
vector<Person> vp;
vp.push_back(p);
}

上面是测试代码,自己看的视频中用的vs编译环境,运行时出错,表示是由于同一块地址被析构两次造成崩溃,浅拷贝。
但自己测试却正常,还特意加了一下两个地址发现地址并不相同,由此觉得是深拷贝。自己用的环境是codeblocks。
这是我运行截图
求大神帮我解决这个问题。
...全文
4991 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
真相重于对错 2020-12-03
  • 打赏
  • 举报
回复
void push_back(const _Ty& _Val) { // insert element at end, provide strong guarantee
        emplace_back(_Val);
    }

    void push_back(_Ty&& _Val) { // insert by moving into element at end, provide strong guarantee
        emplace_back(_STD move(_Val));
    }
摘自vector源码
真相重于对错 2020-12-03
  • 打赏
  • 举报
回复
c++11后用的是完美转发,看看他的源码就清楚了
zhangqinghao0811 2020-12-03
  • 打赏
  • 举报
回复
引用 6 楼 真相重于对错 的回复:
c++11 vector的push_back以后可不是简简单单的深拷贝。
那是啥?
真相重于对错 2020-02-07
  • 打赏
  • 举报
回复
c++11 vector的push_back以后可不是简简单单的深拷贝。
csdnGuoYuying 2020-02-07
  • 打赏
  • 举报
回复
引用 3 楼 GKatHere 的回复:
呃,对了,你类没copy函数,当做浅copy做
好的!
csdnGuoYuying 2020-02-07
  • 打赏
  • 举报
回复
引用 2 楼 寻开心 的回复:
int main(){ Person p("aaa", 20); vector<Person> vp; vp.push_back(p); printf("p.name : %p\n", p.name); printf("vp[0].name: %p\n", vp[0].name); } 你可以看到输出的两个指针是相同的, 说明只是把指针数值复制进去了 你可以给Person再写一个构造函数 Person (const Person&);在其中给name重新分配内存来解决这个问题
哦哦,明白啦,谢谢你!
GKatHere 2020-02-07
  • 打赏
  • 举报
回复
呃,对了,你类没copy函数,当做浅copy做
寻开心 2020-02-07
  • 打赏
  • 举报
回复 2
int main(){
Person p("aaa", 20);
vector<Person> vp;
vp.push_back(p);
printf("p.name : %p\n", p.name);
printf("vp[0].name: %p\n", vp[0].name);
}
你可以看到输出的两个指针是相同的, 说明只是把指针数值复制进去了

你可以给Person再写一个构造函数 Person (const Person&);在其中给name重新分配内存来解决这个问题
GKatHere 2020-02-07
  • 打赏
  • 举报
回复
深copy呃,八个字

65,202

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧