В этом коде указатель массива в структуре, возвращаемой функцией, указывает на тот же блок памяти, который был определен с новой структурой?
#include <iostream>
#include <math.h>
struct Arr
{
const int Col;
const int Row;
double* CAR{ new double[Col * Row] };
Arr(int y, int x) : Col(x), Row(y) {}
void Del() { delete[] CAR; }
int Indx(int y, int x) { return (x + y * Col); }
int Size() { return Col * Row; }
void Print(std::string title);
};
void Arr::Print(std::string title)
{
std::cout << title << '\n';
for (int I = 0; I < Row; I++)
{
for (int In = 0; In < Col; In++)
{
std::cout << CAR[Indx(I, In)] << " / ";
}
std::cout << '\n';
}
}
const Arr retfunc(std::string h, Arr& a, Arr& b)
{
Arr* temp = NULL;
if (h == "Had")
{
temp = new Arr(a.Row, a.Col);
for (int I = 0; I < a.Row; I++)
{
for (int In = 0; In < a.Col; In++)
{
temp->CAR[temp->Indx(I, In)] = a.CAR[a.Indx(I, In)] * b.CAR[b.Indx(I, In)];
}
}
} Arr T = *temp; return T;
}
int main()
{
int val = 5;
Arr a(2, 2);
Arr b(2, 2);
for (int I = 0; I < 2; I++)
{
for (int In = 0; In < 2; In++)
{
a.CAR[a.Indx(I, In)] = 10.0 / val + In;
b.CAR[b.Indx(I, In)] = 8.0 / val + In;
}
}
a.Print("a");
b.Print("b");
Arr S = retfunc("Had", a, b);
S.Print("S");
S.Del();
}
Таким образом, по сути, вызов удаления на S очищает ту же память, которая была выделена в retfunc?
double* CAR{ new double[Col * Row] };
, каковы значенияCol
иRow
? Подсказка: их значения еще не установлены... - person Some programmer dude   schedule 15.03.2021CAR
. - person molbdnilo   schedule 15.03.2021new
вretfunc
. (И вы также пропускаете этот объект и, возможно, разыменовываете нулевой указатель.) - person molbdnilo   schedule 15.03.2021new
в конструкторе. - person Damien   schedule 15.03.2021new
в список инициализаторов конструктора. Или, что еще лучше, используйте вместо этогоstd::vector<double>
. - person Some programmer dude   schedule 15.03.2021Col
иRow
действительно инициализируются перед использованием для инициализацииCAR
. Код по-прежнему является рецептом для утечек памяти, но инициализация кажется правильной, по крайней мере, для MSVC (не тестировалось с другими компиляторами). - person Serge Ballesta   schedule 15.03.2021constexpr
вы гарантируете отсутствие UB, так что Demo является доказательством ( если не ошибка компилятора ;-)). - person Jarod42   schedule 15.03.2021