【发布时间】:2021-06-12 13:19:44
【问题描述】:
在这段代码中,函数返回的结构中的数组指针是否指向用新结构定义的同一块内存?
#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 上调用 delete 是否会清除在 retfunc 中分配的相同内存?
【问题讨论】:
-
当您执行
double* CAR{ new double[Col * Row] };时,Col和Row的值是多少?提示:它们的值尚未设置... -
你应该在构造函数中实现
new。 -
@Damien 它们在构造函数中设置,但为时已晚!我不这么认为(但不太确定)。因此,我在 g++ 10.2 中进行了尝试:Demo in coliru。据此,在构造函数中覆盖默认初始化的成员似乎是有效的,并且它们仍然会在其他成员的默认初始化中被考虑。 (我承认演示还不是证明......)
-
@Someprogrammerdude:我在 MSVC 和调试模式下测试了该代码,并惊讶于 MSVC 正确处理它:它按声明顺序分配成员,因此
Col和Row确实在之前初始化用于CAR初始化。该代码仍然是内存泄漏的秘诀,但初始化似乎至少对于 MSVC 是正确的(未使用其他编译器测试) -
@Scheff 确实很有趣。从律师的角度来看,我可能是错的。但就个人而言,我会避免这样的建设...... :)
标签: c++ pointers struct new-operator