Предотвращение утечек памяти с помощью длинных выражений, которые используют перегруженные операторы для объектов, выделенных из кучи - PullRequest
0 голосов
/ 29 мая 2019

Я делаю векторные объекты и использую перегрузку операторов, чтобы их можно было легко добавлять, вычитать и т. Д. В настоящее время все мои операторные функции вычисляют результирующий вектор и возвращают его. В случае всех векторов элементы выделяются кучей, и это происходит в конструкторе, поэтому результирующий вектор также выделяется кучей. Теперь я столкнулся с проблемой. Предположим, я хотел вычислить следующее (предполагая, что функции перегрузки операторов сложения и умножения работают, как я уже говорил).

vector x = vector(3);
vector y = vector(3);
vector z = x + 2*y
delete x;
delete y;
delete z;

Что я должен сделать, чтобы не вызвать утечку памяти? Как бы то ни было, мой код создаст новый вектор в памяти для 2 * y, и он просто останется там, а не будет назначен на все. Есть ли альтернативный подход, который мог бы предотвратить это?
Возможно, это не приведет к утечке памяти, хотя я не уверен, как это выяснить (впервые для c ++), я просто предполагаю, что это будет основано на том факте, что 2 * y выделяет память и не удаляется.
Ниже приведены мои определения сложения векторов, скалярного умножения и конструктора.

vector(int dim) {
   n=dim;
   vals = new float[n];
}
vector operator + (const vector y) {
    assert(y.n == n); // n is number of elements
    vector z = vector(n);
    for(int i = 0; i < n; i++) {
        z.vals[i] = vals[i] + y.vals[i]; // vals is a heap allocated array
    }
    return z;
}
vector operator * (const float c) {
    vector z = vector(n)
    for(int i = 0; i < n; i++) {
        z.vals[i] = c*z.vals[i];
    }
    return z;
}
...