我正在创建简单的粒子系统。我有两个typedef结构。首先表示具有一些字段的单个粒子。第二个代表粒子系统。我的问题是我无法释放为每个粒子分配的内存。真的不知道出了什么问题。 这是结构:
typedef struct {
float m;
float *x;
float *v;
float *f;
float R;
} *Particle;
typedef struct {
Particle *p;
int n;
float t;
} *ParticleSystem;
这里是分配
的代码ParticleSystem sys = (ParticleSystem) malloc(sizeof(ParticleSystem));
sys->p = (Particle *) malloc(sizeof(Particle)*noOfParticles);
for(int i=0;i<noOfParticles;i++){
sys->p[i] = (Particle)malloc(sizeof(Particle));
sys->p[i]->f = (float*)malloc(sizeof(float)*2);
sys->p[i]->f[0] = 0.0f;
sys->p[i]->f[1] = 0.0f;
...
sys->p[i]->R = radius;
sys->p[i]->m = mass;
}
sys->n=noOfParticles;
sys->t = 0.0f;
并释放
int n = sys->n;
for(int i=0;i<n;i++){
free(sys->p[i]->f);
...
free(sys->p[i]);//here it breaks
}
free(sys->p);
free(sys);
在线路“free(sys-&gt; p [i])它断了。我不知道为什么,因为我先这样做了 sys-&gt; p [i] =(粒子)malloc(sizeof(Particle))要分配。 Visual Studio说“HEAP [template.exe]:为RtlValidateHeap指定的无效地址(01E70000,01E749B0) Windows在template.exe中触发了一个断点。“
答案 0 :(得分:5)
自从我完成C / C ++编程以来已经有一段时间了,但是那些typedef不会将Particle
声明为指向该结构的指针类型,ParticleSystem
是类型的指针 - 那 - 其他 - 结构?如果是这样,当你分配内存时,你只需要分配足够的内存来保存指针,而不是实际的结构。
例如:
#include <iostream>
using namespace std;
typedef struct {
float m;
float *x;
float *v;
float *f;
float R;
} *Particle;
typedef struct {
Particle *p;
int n;
float t;
} *ParticleSystem;
int main()
{
cout << "sizeof(Particle) = " << sizeof(Particle) << endl;
cout << "sizeof(ParticleSystem) = " << sizeof(ParticleSystem) << endl;
return 0;
}
当我运行该程序时,我得到了:
sizeof(Particle) = 4
sizeof(ParticleSystem) = 4
答案 1 :(得分:4)
制作这样的typedef时我不会使用星号。在malloc'ing内存和使用指针时,这很容易导致很多混乱。只需使用
typedef struct {
float m;
float *x;
float *v;
float *f;
float R;
} Particle;
这将使它更加清晰,我甚至不知道你的typedef会导致哪种行为(你的指针可能只有一个空间)
只需在这两行上划一条线:
sys->p = (Particle *) malloc(sizeof(Particle)*noOfParticles);
sys->p[i] = (Particle)malloc(sizeof(Particle));
我假设您希望首先获得指针的内存,而不是第二位的结构本身的内存。但是这应该怎么做?你在两个mallocs中使用sizeof(Particle)。
答案 2 :(得分:4)
如果这是C,那么你真的不应该输入malloc()
的返回值。如果这是C ++,那么你真的不应该使用malloc()
。
此外,我建议不要typedef
:删除你的指针,这使得遵循代码和发现错误变得更加困难。
此外,如果您知道数组将始终具有恒定的小尺寸,例如两个(malloc()
以这种方式使用),则使用Particle.f
是没有意义的。只需直接声明一个数组,并保存malloc()
和相关的混淆。
答案 3 :(得分:1)
尝试更改:
typedef struct {
float m;
float *x;
float *v;
float *f;
float R;
} *Particle;
到
typedef struct {
float m;
float *x;
float *v;
float *f;
float R;
} Particle;
您需要拥有Particle
才能拥有*Particle
并让sizeof(Particle)
工作......同样适用于ParticleSystem
答案 4 :(得分:1)
我首先将结构声明修复为:
} Particle;
和
} ParticleSystem;
而不是指针。
然后更新其余代码以反映此更改,从以下开始:
ParticleSystem* sys = (ParticleSystem*) malloc(sizeof(ParticleSystem));
sys->p = (Particle*) malloc(sizeof(Particle) * noOfParticles);
答案 5 :(得分:0)
首先,您有Particle *p
,您可以将其分配为单个粒子或粒子数组。
您在第二行中将* p作为数组分配,因此您不能在for循环中再次分配它们,除非您使用Particle **p
然后将*(p)作为数组指定为粒子指向粒子,然后在for循环中分配每个粒子。我不推荐。
如上所述,从结构中删除指针声明。
然后,您不必重新分配每个粒子(因为p是普通指针),您应该只使用free(sys->p);
释放它,因为您将每个粒子分配为直接如我所说,放在记忆中,而不是指针。
希望有所帮助:)