如果有,我给这个类做一个拷贝构造函数,应该怎样为其中的vector容器做深拷贝?
16 个解决方案
#1
new 拷贝构造每个vector中的元素,然后压入新的vector中。
#2
如果说你的类里面的vector存放的是指针的话,你就要注意下这方面的问题了。
#3
vector里放指针就是个悲剧,考虑放shared_ptr或者直接用boost::ptr_vector
#4
谢谢楼上,但我类里面的vector没有存放指针,全是double类型,用这个类做的vector仍然会出问题,如果数据结构如此简单,会不会不是浅拷贝的问题?
#5
应该不会出问题,能否把类的定义贴上来?
#6
不会
但效率比较低
但效率比较低
#7
代码贴出来会更好~
估计是操作vector 的时候出问题。
估计是操作vector 的时候出问题。
#8
浅拷贝是bitwise的,也就是说只拷贝你那个类
的大小,
我简单测试了一下,简单的数据类型double没问题。
#9
class A
{
public:
std::vector<double> V;
};
然后又有
std::vector<A> AV;
由于实际上AV只会有3个元素,所以写了
AV.resize(3);
不知是不是这个地方会出问题?
{
public:
std::vector<double> V;
};
然后又有
std::vector<A> AV;
由于实际上AV只会有3个元素,所以写了
AV.resize(3);
不知是不是这个地方会出问题?
#11
容器中包含容器就不能resize么?
话说复制不就是一个operator=的事情么?
话说复制不就是一个operator=的事情么?
#12
谢谢楼上,这篇文章我也看过,但是不能解释我的问题
首先里面提到resize时调用默认构造函数,但是我在有的地方看到resize因为可能调用insert,而insert实际调用的是拷贝构造函数,所以这个地方可能会是拷贝构造函数的问题
因为我目前已经发现这个AV容器销毁时delete有问题,估计可能是重复删除,所以又在A类里面写了拷贝构造函数,但是不知对这样结构的类来讲有没有这个必要?如果有,可能我的拷贝构造函数写得有问题,请问对这个类来讲正确的写法应该是什么?
首先里面提到resize时调用默认构造函数,但是我在有的地方看到resize因为可能调用insert,而insert实际调用的是拷贝构造函数,所以这个地方可能会是拷贝构造函数的问题
因为我目前已经发现这个AV容器销毁时delete有问题,估计可能是重复删除,所以又在A类里面写了拷贝构造函数,但是不知对这样结构的类来讲有没有这个必要?如果有,可能我的拷贝构造函数写得有问题,请问对这个类来讲正确的写法应该是什么?
#13
不必写,拷贝时会自动调用类成员的拷贝构造函数
“因为我目前已经发现这个AV容器销毁时delete有问题”
你在堆上建立的?如何delete的?
“因为我目前已经发现这个AV容器销毁时delete有问题”
你在堆上建立的?如何delete的?
#14
不好意思没说清,我没有手动销毁,是包含AV的对象析构时爆出vector文件内部执行delete时传递了错误的参数,我想应该就是重复delete的问题
这个错误在另一个线程向AV加入数据后才会发生,而此时调用AV.resize(10)也会出一样的问题,因为此时要搬家,要析构原来的老元素了,但是不解为什么这个容器为何写入数据后才会出这样的错误
这个错误在另一个线程向AV加入数据后才会发生,而此时调用AV.resize(10)也会出一样的问题,因为此时要搬家,要析构原来的老元素了,但是不解为什么这个容器为何写入数据后才会出这样的错误
#15
谢谢大家,看来不是拷贝构造函数的问题,这个类不需要自己写拷贝构造函数
是跨模块访问stl造成的问题
是跨模块访问stl造成的问题
#16
没用指针, 不需要太多其他的处理吧
#1
new 拷贝构造每个vector中的元素,然后压入新的vector中。
#2
如果说你的类里面的vector存放的是指针的话,你就要注意下这方面的问题了。
#3
vector里放指针就是个悲剧,考虑放shared_ptr或者直接用boost::ptr_vector
#4
谢谢楼上,但我类里面的vector没有存放指针,全是double类型,用这个类做的vector仍然会出问题,如果数据结构如此简单,会不会不是浅拷贝的问题?
#5
应该不会出问题,能否把类的定义贴上来?
#6
不会
但效率比较低
但效率比较低
#7
代码贴出来会更好~
估计是操作vector 的时候出问题。
估计是操作vector 的时候出问题。
#8
浅拷贝是bitwise的,也就是说只拷贝你那个类
的大小,
我简单测试了一下,简单的数据类型double没问题。
#9
class A
{
public:
std::vector<double> V;
};
然后又有
std::vector<A> AV;
由于实际上AV只会有3个元素,所以写了
AV.resize(3);
不知是不是这个地方会出问题?
{
public:
std::vector<double> V;
};
然后又有
std::vector<A> AV;
由于实际上AV只会有3个元素,所以写了
AV.resize(3);
不知是不是这个地方会出问题?
#10
#11
容器中包含容器就不能resize么?
话说复制不就是一个operator=的事情么?
话说复制不就是一个operator=的事情么?
#12
谢谢楼上,这篇文章我也看过,但是不能解释我的问题
首先里面提到resize时调用默认构造函数,但是我在有的地方看到resize因为可能调用insert,而insert实际调用的是拷贝构造函数,所以这个地方可能会是拷贝构造函数的问题
因为我目前已经发现这个AV容器销毁时delete有问题,估计可能是重复删除,所以又在A类里面写了拷贝构造函数,但是不知对这样结构的类来讲有没有这个必要?如果有,可能我的拷贝构造函数写得有问题,请问对这个类来讲正确的写法应该是什么?
首先里面提到resize时调用默认构造函数,但是我在有的地方看到resize因为可能调用insert,而insert实际调用的是拷贝构造函数,所以这个地方可能会是拷贝构造函数的问题
因为我目前已经发现这个AV容器销毁时delete有问题,估计可能是重复删除,所以又在A类里面写了拷贝构造函数,但是不知对这样结构的类来讲有没有这个必要?如果有,可能我的拷贝构造函数写得有问题,请问对这个类来讲正确的写法应该是什么?
#13
不必写,拷贝时会自动调用类成员的拷贝构造函数
“因为我目前已经发现这个AV容器销毁时delete有问题”
你在堆上建立的?如何delete的?
“因为我目前已经发现这个AV容器销毁时delete有问题”
你在堆上建立的?如何delete的?
#14
不好意思没说清,我没有手动销毁,是包含AV的对象析构时爆出vector文件内部执行delete时传递了错误的参数,我想应该就是重复delete的问题
这个错误在另一个线程向AV加入数据后才会发生,而此时调用AV.resize(10)也会出一样的问题,因为此时要搬家,要析构原来的老元素了,但是不解为什么这个容器为何写入数据后才会出这样的错误
这个错误在另一个线程向AV加入数据后才会发生,而此时调用AV.resize(10)也会出一样的问题,因为此时要搬家,要析构原来的老元素了,但是不解为什么这个容器为何写入数据后才会出这样的错误
#15
谢谢大家,看来不是拷贝构造函数的问题,这个类不需要自己写拷贝构造函数
是跨模块访问stl造成的问题
是跨模块访问stl造成的问题
#16
没用指针, 不需要太多其他的处理吧