#include <iostream>
#include <vector>
#include <cassert>
class a_class
{
public:
int num_IN;
a_class():num_IN(0){}
a_class(a_class const & origin){/*Initialise();*/} //if not called here, error occurs
void Initialise(){num_IN =5;}
};
int main ()
{
std::vector <a_class> the_vector;
for(int q=0; q < 30; q++)
{
the_vector.push_back(a_class());
the_vector[q].Initialise();
assert(5 == the_vector[q].num_IN); //no problem here
}
for(int q=0; q < 30; q++)
assert(the_vector[q].num_IN == 5); //assertion fails
}
我不明白从 CC 外部和内部调用它之间的区别。我也不知道为什么它无论如何都会引起问题。
最佳答案
std::vector
可能会重新分配它使用的缓冲区,如果它的大小超过它,在这种情况下它必须将旧元素复制到新缓冲区。如果您没有合适的复制构造函数来复制 num_IN
,旧值就会丢失。
通过提供适当的复制构造函数来解决这个问题:
a_class(a_class const & origin) : num_IN(origin.num_IN) {}
在发布的代码中,甚至不需要复制构造函数 - 如果您不提供,编译器将在此处生成一个合适的构造函数。
关于C++:从复制构造函数外部修改对象成员时 vector 内存损坏,但从内部修改时则不会,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6715172/