以含有stl容器的类为类型的stl容器的深拷贝问题

hind24 2011-01-10 04:50:59
标题有点绕口,简单的说就是有个类,类里面有些vector容器,然后用这个类作为类型做一个vector容器,析构时会不会有重复delete的危险?

如果有,我给这个类做一个拷贝构造函数,应该怎样为其中的vector容器做深拷贝?
...全文
302 16 打赏 收藏 转发到动态 举报
写回复
用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中。

64,676

社区成员

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

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