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