社区
C++ 语言
帖子详情
以含有stl容器的类为类型的stl容器的深拷贝问题
hind24
2011-01-10 04:50:59
标题有点绕口,简单的说就是有个类,类里面有些vector容器,然后用这个类作为类型做一个vector容器,析构时会不会有重复delete的危险?
如果有,我给这个类做一个拷贝构造函数,应该怎样为其中的vector容器做深拷贝?
...全文
302
16
打赏
收藏
以含有stl容器的类为类型的stl容器的深拷贝问题
标题有点绕口,简单的说就是有个类,类里面有些vector容器,然后用这个类作为类型做一个vector容器,析构时会不会有重复delete的危险? 如果有,我给这个类做一个拷贝构造函数,应该怎样为其中的vector容器做深拷贝?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
16 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
h100037
2011-01-11
打赏
举报
回复
没用指针, 不需要太多其他的处理吧
hind24
2011-01-11
打赏
举报
回复
谢谢大家,看来不是拷贝构造函数的问题,这个类不需要自己写拷贝构造函数
是跨模块访问stl造成的问题
hind24
2011-01-10
打赏
举报
回复
不好意思没说清,我没有手动销毁,是包含AV的对象析构时爆出vector文件内部执行delete时传递了错误的参数,我想应该就是重复delete的问题
这个错误在另一个线程向AV加入数据后才会发生,而此时调用AV.resize(10)也会出一样的问题,因为此时要搬家,要析构原来的老元素了,但是不解为什么这个容器为何写入数据后才会出这样的错误
zhangsongcui
2011-01-10
打赏
举报
回复
不必写,拷贝时会自动调用类成员的拷贝构造函数
“因为我目前已经发现这个AV容器销毁时delete有问题”
你在堆上建立的?如何delete的?
hind24
2011-01-10
打赏
举报
回复
谢谢楼上,这篇文章我也看过,但是不能解释我的问题
首先里面提到resize时调用默认构造函数,但是我在有的地方看到resize因为可能调用insert,而insert实际调用的是拷贝构造函数,所以这个地方可能会是拷贝构造函数的问题
因为我目前已经发现这个AV容器销毁时delete有问题,估计可能是重复删除,所以又在A类里面写了拷贝构造函数,但是不知对这样结构的类来讲有没有这个必要?如果有,可能我的拷贝构造函数写得有问题,请问对这个类来讲正确的写法应该是什么?
zhangsongcui
2011-01-10
打赏
举报
回复
容器中包含容器就不能resize么?
话说复制不就是一个operator=的事情么?
bluesky12312388
2011-01-10
打赏
举报
回复
[Quote=引用 9 楼 hind24 的回复:]
class A
{
public:
std::vector<double> V;
};
然后又有
std::vector<A> AV;
由于实际上AV只会有3个元素,所以写了
AV.resize(3);
不知是不是这个地方会出问题?
[/Quote]
是的,
这里说的很清楚了。
http://blog.csdn.net/shuchao/archive/2009/01/05/3713219.aspx
hind24
2011-01-10
打赏
举报
回复
class A
{
public:
std::vector<double> V;
};
然后又有
std::vector<A> AV;
由于实际上AV只会有3个元素,所以写了
AV.resize(3);
不知是不是这个地方会出问题?
bluesky12312388
2011-01-10
打赏
举报
回复
[Quote=引用 4 楼 hind24 的回复:]
谢谢楼上,但我类里面的vector没有存放指针,全是double类型,用这个类做的vector仍然会出问题,如果数据结构如此简单,会不会不是浅拷贝的问题?
[/Quote]
浅拷贝是bitwise的,也就是说只拷贝你那个类
的大小,
我简单测试了一下,简单的数据类型double没问题。
食财物权情性
2011-01-10
打赏
举报
回复
代码贴出来会更好~
估计是操作vector 的时候出问题。
hai040
2011-01-10
打赏
举报
回复
不会
但效率比较低
zhangsongcui
2011-01-10
打赏
举报
回复
应该不会出问题,能否把类的定义贴上来?
hind24
2011-01-10
打赏
举报
回复
谢谢楼上,但我类里面的vector没有存放指针,全是double类型,用这个类做的vector仍然会出问题,如果数据结构如此简单,会不会不是浅拷贝的问题?
zhangsongcui
2011-01-10
打赏
举报
回复
vector里放指针就是个悲剧,考虑放shared_ptr或者直接用boost::ptr_vector
pengzhixi
2011-01-10
打赏
举报
回复
如果说你的类里面的vector存放的是指针的话,你就要注意下这方面的问题了。
ryfdizuo
2011-01-10
打赏
举报
回复
new 拷贝构造每个vector中的元素,然后压入新的vector中。
朱老师C++课程第3部分3.2.
STL
的
容器
类和迭代器
《朱老师带你学C++》属于系列课程《朱有鹏老师热门编程语言全解》的第一部分,主要针对C++... *基础知识 + 思路引导的教学方式,授之以鱼更授之以渔。 *系列课程。本教程只是入门篇,后续还有更多更精彩视频更新中。
C++的
STL
容器
类详解
STL
(Standard Template Library)是C++标准库中的一个重要组成部分,它提供了一组通用的模板类和函数,用于实现常用的数据结构和算法。(Containers):
STL
提供了多种
容器
类,如向量(vector)、链表(list)、双向链表(deque)、集合(set)、映射(map)等。总而言之,
STL
是C++开发中非常重要的工具之一,它提供了高效的数据结构和算法,能够提高程序的性能、减少开发时间,并提高代码的重用性和可维护性。这样可以大大提高代码的重用性,减少了开发时间和维护成本。
STL
教程9-
容器
元素
深
拷贝
和浅
拷贝
问题
定义一个类 下面有个指针成员,这样容易出现浅
拷贝
问题
然后定义一个类的对象,把它放到
容器
里面 然后直接报错 原因在于外面的对象和vector里面对象的name指针都指向了同一块内存,在程序结束后,外面对象开始析构,析构完成后vector里面的元素也要析构, 这样同一块内存就析构了两次,就会发生错误 修改后的代码 重新运行没有崩溃
STL
所有
容器
提供的都是值语意,而非引用语意。
容器
执行插入元素操作时,内部内部实施了
拷贝
工作,将我们要插入的元素在
拷贝
一份放入到
容器
汇总,而不是将原数据元素直接放进
容器
中,因此
STL
:
容器
共性机制、
容器
元素
深
拷贝
和浅
拷贝
问题
11
STL
容器
深
浅
拷贝
容器
共性机制
STL
容器
共性机制
STL
容器
所提供的都是值(value)寓意,而非引用(reference)寓意,也就是说当我们给
容器
中插入元素的时候,
容器
内部实施了
拷贝
动作,将我们要插入的元素再另行
拷贝
一份放 入到
容器
中,而不是将原数据元素直接放进
容器
中,也就是说**我们提供的元素必须能够被拷 贝。** 除了queue 和stack 之外,每个
容器
都提供可返回迭代器的函数,运用返回的迭代器就可以访问元素。 通常
STL
不会抛出异常,需要使用者传入正确参数。 每个
容器
都提供了一个默认的构造函数和默认的
拷贝
C++ 语言
64,676
社区成员
250,490
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章