如何绕过删除太多东西?

时间:2016-02-28 21:57:57

标签: c++

我已经提炼了我的问题的本质!例如:

struct arrayInside {
    int* arr;

    arrayInside(int n) {
        arr = new int[n];
    }
    ~arrayInside() {
        delete arr;
    }
};

void main() {
    std::vector<arrayInside> vec;

    for (int i = 10; i < 20; i++) {
        vec.push_back(arrayInside(i));
    }
}

这会导致崩溃,因为每次push_back进入向量时,都会调用析构函数,最后,它最终会尝试删除地址,实际上并不包含在构造函数中创建的数组。

我可以通过存储arrayInside的指针来避免这种情况,但这是方便的,我不想再次遍历向量来删除每个项目。如何使arrayInside类向量证明?

2 个答案:

答案 0 :(得分:0)

指针被复制,然后尝试将其删除两次。

Zereges在评论中给出了答案:复制构造函数可以正确删除和重新创建,移动构造函数最好。

答案 1 :(得分:0)

只要

std::vector调整其内部存储空间的大小,它就会复制(或移动)它存储的实例。这可能是由于向向量添加实例而发生的。

要解决这个问题,你需要实现一个复制构造函数和一个复制赋值运算符,也可能是它们的移动等价物(从C ++ 11开始)。

我假设您为了学习目的而编写该代码。生产代码不应该需要这些(规则为零)。

进一步阅读:http://en.cppreference.com/w/cpp/language/rule_of_three