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

时间:2021-08-21 19:53:59
标题有点绕口,简单的说就是有个类,类里面有些vector容器,然后用这个类作为类型做一个vector容器,析构时会不会有重复delete的危险?

如果有,我给这个类做一个拷贝构造函数,应该怎样为其中的vector容器做深拷贝?

16 个解决方案

#1


new 拷贝构造每个vector中的元素,然后压入新的vector中。

#2


如果说你的类里面的vector存放的是指针的话,你就要注意下这方面的问题了。

#3


vector里放指针就是个悲剧,考虑放shared_ptr或者直接用boost::ptr_vector

#4


谢谢楼上,但我类里面的vector没有存放指针,全是double类型,用这个类做的vector仍然会出问题,如果数据结构如此简单,会不会不是浅拷贝的问题?

#5


应该不会出问题,能否把类的定义贴上来?

#6


不会
但效率比较低

#7


代码贴出来会更好~
估计是操作vector 的时候出问题。

#8


引用 4 楼 hind24 的回复:
谢谢楼上,但我类里面的vector没有存放指针,全是double类型,用这个类做的vector仍然会出问题,如果数据结构如此简单,会不会不是浅拷贝的问题?

浅拷贝是bitwise的,也就是说只拷贝你那个类
的大小,
我简单测试了一下,简单的数据类型double没问题。

#9


class A
{
public:
std::vector<double> V;
};

然后又有

std::vector<A> AV;

由于实际上AV只会有3个元素,所以写了

AV.resize(3);

不知是不是这个地方会出问题?

#10


引用 9 楼 hind24 的回复:
class A
{
public:
std::vector<double> V;
};

然后又有

std::vector<A> AV;

由于实际上AV只会有3个元素,所以写了

AV.resize(3);

不知是不是这个地方会出问题?

是的,
这里说的很清楚了。
http://blog.csdn.net/shuchao/archive/2009/01/05/3713219.aspx

#11


容器中包含容器就不能resize么?
话说复制不就是一个operator=的事情么?

#12


谢谢楼上,这篇文章我也看过,但是不能解释我的问题

首先里面提到resize时调用默认构造函数,但是我在有的地方看到resize因为可能调用insert,而insert实际调用的是拷贝构造函数,所以这个地方可能会是拷贝构造函数的问题

因为我目前已经发现这个AV容器销毁时delete有问题,估计可能是重复删除,所以又在A类里面写了拷贝构造函数,但是不知对这样结构的类来讲有没有这个必要?如果有,可能我的拷贝构造函数写得有问题,请问对这个类来讲正确的写法应该是什么?

#13


不必写,拷贝时会自动调用类成员的拷贝构造函数
“因为我目前已经发现这个AV容器销毁时delete有问题”
你在堆上建立的?如何delete的?

#14


不好意思没说清,我没有手动销毁,是包含AV的对象析构时爆出vector文件内部执行delete时传递了错误的参数,我想应该就是重复delete的问题

这个错误在另一个线程向AV加入数据后才会发生,而此时调用AV.resize(10)也会出一样的问题,因为此时要搬家,要析构原来的老元素了,但是不解为什么这个容器为何写入数据后才会出这样的错误

#15


谢谢大家,看来不是拷贝构造函数的问题,这个类不需要自己写拷贝构造函数

是跨模块访问stl造成的问题

#16


没用指针, 不需要太多其他的处理吧

#1


new 拷贝构造每个vector中的元素,然后压入新的vector中。

#2


如果说你的类里面的vector存放的是指针的话,你就要注意下这方面的问题了。

#3


vector里放指针就是个悲剧,考虑放shared_ptr或者直接用boost::ptr_vector

#4


谢谢楼上,但我类里面的vector没有存放指针,全是double类型,用这个类做的vector仍然会出问题,如果数据结构如此简单,会不会不是浅拷贝的问题?

#5


应该不会出问题,能否把类的定义贴上来?

#6


不会
但效率比较低

#7


代码贴出来会更好~
估计是操作vector 的时候出问题。

#8


引用 4 楼 hind24 的回复:
谢谢楼上,但我类里面的vector没有存放指针,全是double类型,用这个类做的vector仍然会出问题,如果数据结构如此简单,会不会不是浅拷贝的问题?

浅拷贝是bitwise的,也就是说只拷贝你那个类
的大小,
我简单测试了一下,简单的数据类型double没问题。

#9


class A
{
public:
std::vector<double> V;
};

然后又有

std::vector<A> AV;

由于实际上AV只会有3个元素,所以写了

AV.resize(3);

不知是不是这个地方会出问题?

#10


引用 9 楼 hind24 的回复:
class A
{
public:
std::vector<double> V;
};

然后又有

std::vector<A> AV;

由于实际上AV只会有3个元素,所以写了

AV.resize(3);

不知是不是这个地方会出问题?

是的,
这里说的很清楚了。
http://blog.csdn.net/shuchao/archive/2009/01/05/3713219.aspx

#11


容器中包含容器就不能resize么?
话说复制不就是一个operator=的事情么?

#12


谢谢楼上,这篇文章我也看过,但是不能解释我的问题

首先里面提到resize时调用默认构造函数,但是我在有的地方看到resize因为可能调用insert,而insert实际调用的是拷贝构造函数,所以这个地方可能会是拷贝构造函数的问题

因为我目前已经发现这个AV容器销毁时delete有问题,估计可能是重复删除,所以又在A类里面写了拷贝构造函数,但是不知对这样结构的类来讲有没有这个必要?如果有,可能我的拷贝构造函数写得有问题,请问对这个类来讲正确的写法应该是什么?

#13


不必写,拷贝时会自动调用类成员的拷贝构造函数
“因为我目前已经发现这个AV容器销毁时delete有问题”
你在堆上建立的?如何delete的?

#14


不好意思没说清,我没有手动销毁,是包含AV的对象析构时爆出vector文件内部执行delete时传递了错误的参数,我想应该就是重复delete的问题

这个错误在另一个线程向AV加入数据后才会发生,而此时调用AV.resize(10)也会出一样的问题,因为此时要搬家,要析构原来的老元素了,但是不解为什么这个容器为何写入数据后才会出这样的错误

#15


谢谢大家,看来不是拷贝构造函数的问题,这个类不需要自己写拷贝构造函数

是跨模块访问stl造成的问题

#16


没用指针, 不需要太多其他的处理吧