快速的问题; 我已经围绕一派,找到了一些答案,但我是一个有点偏执,所以我想是肯定的。
考虑这种情况:
struct CoordLocation
{
float X;
float Y;
float Z;
};
int main()
{
CoordLocation *coord = new CoordLocation();
delete coord;
return 0;
}
将呼叫也删除清除领域的X,Y,Z使用的内存? 一些答案,我发现提到,我刚刚删除的指针,而不是实际引用对象的这种方式。 如果...
struct CoordLocation
{
float *X;
float *Y;
float *Z;
};
int main()
{
CoordLocation *coord = new CoordLocation();
delete coord;
return 0;
}
而如果我手动免费为结构的构造函数/析构函数内的每个对象的内存?
struct CoordLocation
{
CoordLocation()
{
*X = new float;
*Y = new float;
*Z = new float;
}
~CoordLocation()
{
delete X; delete Y; delete Z;
}
float *X;
float *Y;
float *Z;
};
int main()
{
CoordLocation *coord = new CoordLocation();
delete coord;
return 0;
}
我注意到,对于简单的情况,例如:
float *a = new float;
*a = 5.0f;
printf("%f", *a);
delete a;
printf("%f", &a);
printf的将打印5.0,所以变量指向一个是不完全破坏。
所以我的问题是:我怎么能可靠地自由(如没有内存泄漏)ALL在这种情况下使用的结构的记忆?
struct CoordLocation
{
float X;
float Y;
float Z;
};
int main()
{
CoordLocation *coord = new CoordLocation();
delete coord;
return 0;
}
谢谢!
你只需要delete
您分配内存new
。
printf的将打印5.0,所以变量指向一个是不完全破坏。
你的确在为未定义行为。 虽然价值仍然存在,内存被释放,可重复使用。
所以下面:
struct CoordLocation
{
float X;
float Y;
float Z;
};
如果省略析构函数不能创建一个内存泄漏。
你的下一个片段:
struct CoordLocation
{
float *X;
float *Y;
float *Z;
};
int main()
{
CoordLocation *coord = new CoordLocation();
delete coord;
return 0;
}
可以潜在地产生内存泄漏,但还不如说是。 下面将:
int main()
{
CoordLocation *coord = new CoordLocation();
coord->X = new float();
delete coord;
return 0;
}
你的第三个例子
struct CoordLocation
{
CoordLocation()
{
*X = new float;
*Y = new float;
*Z = new float;
}
~CoordLocation()
{
delete X; delete Y; delete Z;
}
float *X;
float *Y;
float *Z;
};
int main()
{
CoordLocation *coord = new CoordLocation();
delete coord;
return 0;
}
因为你释放所有你分配的内存不会造成内存泄漏。 如果你省略析构函数或忘记调用delete coord;
,他们你有内存泄漏。
一个好的经验法则:调用delete
每一个new
和delete[]
为每个new[]
和你是安全的。
在这个例子:
struct CoordLocation
{
float X;
float Y;
float Z;
};
int main()
{
CoordLocation *coord = new CoordLocation();
delete coord;
return 0;
}
该内存被释放 。 有在该代码没有泄漏。 在你给的例子,在你的结构包含指针,只要你释放他们在析构函数(如你在你的例子一样),不会有泄漏。
在这个片段:
float *a = new float;
*a = 5.0f;
printf("%f", *a);
delete a;
printf("%f", &a);
值a
停留在删除后是相同的,因为delete
(荷兰国际集团)的指针只标注一个内存地址为“解放”,也不会修改其内容。 访问释放的指针是未定义的行为。
本身具有自动存储时间分配的指针,没有什么自由存在。 该结构是这三个字段,当你调用它被释放delete
。 您只需拨打delete
对被退回的东西new
。
当您分配东西,你分配足够的内存来保存它,这意味着足够的内存来容纳所有字段(和一些内部内存是实现特定的,但你不用担心这一点)。 当你删除它,你释放你分配的内存量相同。
有一件事不过要注意的是这样的情况下(在C ++中,你会不会产生一种这样的,但如相关):
struct Foo {
char *str;
};
Foo *f = new Foo();
f->str = new char[10];
delete f;
在这种情况下,你有泄漏。 您删除f
,其中包括足够的内存来保存单个char*
,但什么是char*
到已经动态分配的积分。 所以,你需要释放它太:
delete f->str;
delete f;
同样,在C ++中,你可能会没有设计类型这样一来,反而有利于像类型std::string
和原则,如RAII,但例子是相关的。