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

pch*_*hot 2 c memory free struct

我正在创建简单的粒子系统.我有两个typedef结构.首先表示具有一些字段的单个粒子.第二个代表粒子系统.我的问题是我无法释放为每个粒子分配的内存.真的不知道出了什么问题.这是结构:

typedef struct {
   float m;  
   float *x;  
   float *v;    
   float *f;     
   float R;
} *Particle;

typedef struct {
   Particle *p;
   int n; 
   float t; 
} *ParticleSystem;
Run Code Online (Sandbox Code Playgroud)

这里是分配代码

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;
Run Code Online (Sandbox Code Playgroud)

和释放

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);
Run Code Online (Sandbox Code Playgroud)

在行"free(sys-> p [i])它断开.我不知道为什么,因为首先我做这个
sys-> p [i] =(Particle)malloc(sizeof(Particle))来分配. Studio说"HEAP [template.exe]:为RtlValidateHeap(01E70000,01E749B0)指定的无效地址Windows已在template.exe中触发了断点."

Qua*_*nic 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;
}
Run Code Online (Sandbox Code Playgroud)

当我运行该程序时,我得到:

sizeof(Particle) = 4
sizeof(ParticleSystem) = 4
Run Code Online (Sandbox Code Playgroud)

  • "C或C++编程"的简写 (3认同)