C ++ двойная ошибка из-за копирования функции

Я работаю над книгой Stroustrup C ++ 11 и столкнулся с двойным бесплатным исключением. Я понимаю, что это освобождает память дважды, но я не понимаю, почему это происходит для функции, которая передается при копировании:

#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 () берет класс Vector и создает новый вектор с дублированным содержимым? Почему это привело бы к двойной свободе? Я предполагаю, что RIIA в этом случае каким-то образом взаимодействует с Vector :: ~ Vector (), что-то вроде условия гонки?

Я знаю, если я изменю это, чтобы передать его аргумент по ссылке, он избежит двойного освобождения. Я пытаюсь лучше понять проблему с передачей копии.

Спасибо!

1

Решение

На самом деле вы вызываете print_product со ссылкой на myVectorтак что все хорошо.
Проблемы начинаются с прохождения myVector по значению, потому что конструктор копирования по умолчанию будет копировать elem указатель вместо дублирования всего массива.
И то и другое ALL_Vector::Vector elem Указатель будет относиться к одному и тому же хранилищу памяти и, таким образом, будет удален дважды.
Чтобы решить эту проблему, вы должны реализовать конструктор копирования, чтобы создать новый массив и скопировать все элементы.

5

Другие решения

Если вы пройдете Vector для каждого значения вызывается конструктор копирования, а не реализованный вами конструктор.
В этом случае, elem не дублируется, но указатель копируется в новый объект, а затем дважды удаляется деструктором.
Вы должны реализовать конструктор копирования, который выделяет новый elem и скопировать все элементы.

1

По вопросам рекламы [email protected]