我已经提炼了我的问题的本质!例如:
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类向量证明?
答案 0 :(得分:0)
指针被复制,然后尝试将其删除两次。
Zereges在评论中给出了答案:复制构造函数可以正确删除和重新创建,移动构造函数最好。
答案 1 :(得分:0)
std::vector
调整其内部存储空间的大小,它就会复制(或移动)它存储的实例。这可能是由于向向量添加实例而发生的。
要解决这个问题,你需要实现一个复制构造函数和一个复制赋值运算符,也可能是它们的移动等价物(从C ++ 11开始)。
我假设您为了学习目的而编写该代码。生产代码不应该需要这些(规则为零)。
进一步阅读:http://en.cppreference.com/w/cpp/language/rule_of_three