无法释放指向先前分配的结构的指针

时间:2011-04-05 16:11:16

标签: c memory struct free

我正在创建简单的粒子系统。我有两个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中触发了一个断点。“

6 个答案:

答案 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);释放它,因为您将每个粒子分配为直接如我所说,放在记忆中,而不是指针。

希望有所帮助:)

相关问题