Я работаю над книгой Stroustrup C++ 11, и я столкнулся с двойным свободным исключением. Я понимаю, что это освобождение памяти в два раза, но то, что я не понимаю, почему это происходит для функции, которая проходя мимо копии:C++ double free error from function copy
#include <iostream>
using namespace std;
namespace ALL_Vector {
class Vector {
public:
// Intitialize elem and sz before the actual function
Vector(int size) :elem {new double[size]}, sz {size} {};
~Vector() {delete[] elem;};
double& operator[](int i) {
return elem[i];
};
int size() {return sz;};
private:
double* elem;
int sz;
};
void print_product(Vector& y) {
double result {1};
for (auto x = 0; x < y.size() ; x++){
if (y[x] > 0) {result *= y[x]; };
}
cout << "The product of Vector y is: " << result << ", or so it would appear ;)\n";
}
}
/*
Self test of the Vector class.
*/
int main(){
ALL_Vector::Vector myVector(15);
cout << "The size of Vector y is: " << myVector.size() << "\n";
myVector[0] = 12;
myVector[2] = 7;
myVector[3] = 19;
myVector[4] = 2;
ALL_Vector::print_product(myVector);
return 0;
}
print_product() принимает вектор класса и создавая новый вектор с дублируется содержание? Почему это приведет к двойному освобождению? Я предполагаю, что RIIA в этом случае каким-то образом взаимодействует с Vector :: ~ Vector(), что-то вроде состояния гонки?
Я знаю, если я изменю это, чтобы передать его аргумент по ссылке, он избежит двойного освобождения. Я пытаюсь лучше понять проблему с передачей по копии.
Спасибо!
Этот код работает [штраф] (https://ideone.com/ImpImv). –
@LeFlou: У этого есть ошибка, которую тест не обнаруживает, а именно это нарушает правило трех. Интересно, что в вашем комментарии говорится, что код работает нормально, тогда ваш ответ объясняет, почему это не^_^ –