Mat*_*son 5 c++ memory vector copy-constructor
#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
}
Run Code Online (Sandbox Code Playgroud)
我不了解从CC外部调用与内部调用之间的区别。我也不知道为什么无论如何都会引起问题。
std::vector可能会重新分配它使用的缓冲区(如果其大小超出了它的大小),在这种情况下,它必须将旧元素复制到新缓冲区中。如果没有合适的复制构造函数进行复制num_IN,则旧值将丢失。
通过提供适当的副本构造函数来解决此问题:
a_class(a_class const & origin) : num_IN(origin.num_IN) {}
Run Code Online (Sandbox Code Playgroud)
在发布的代码中甚至不需要复制构造函数-如果您不提供复制构造函数,则编译器将在此处生成合适的复制构造函数。
| 归档时间: |
|
| 查看次数: |
2351 次 |
| 最近记录: |