C ++:从复制构造函数外部修改对象成员时矢量内存损坏,但从内部修改对象成员时矢量内存损坏

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外部调用与内部调用之间的区别。我也不知道为什么无论如何都会引起问题。

Geo*_*che 5

std::vector可能会重新分配它使用的缓冲区(如果其大小超出了它的大小),在这种情况下,它必须将旧元素复制到新缓冲区中。如果没有合适的复制构造函数进行复制num_IN,则旧值将丢失。

通过提供适当的副本构造函数来解决此问题:

a_class(a_class const & origin) : num_IN(origin.num_IN) {}
Run Code Online (Sandbox Code Playgroud)

在发布的代码中甚至不需要复制构造函数-如果您不提供复制构造函数,则编译器将在此处生成合适的复制构造函数。