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

标签 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
}

我不明白从 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/

相关文章:

c++ - 为来自不同进程的窗口设置父级是否正确?

c++ - 设置自动完成以处理语义

arrays - Swift Array 弱持有元素

java - JVM内存和CPU使用的实际限制?

algorithm - 点看点

c++ - 使用 -pthread 如何不违反 ODR 规则?

c++ - 从没有默认构造函数的虚拟基类派生类

c++ - 我们可以使用 'malloced' 释放 'delete' 内存吗?

c++ - Eigen::RowVector 迭代器

c++ - 关于 vector.push_back