在 C 中无法释放动态结构数组
failing freeing dynamic struct array in c
我在释放动态结构数组时遇到了一些问题,我不明白为什么。
首先是这个结构:
typedef struct
{
char name[LEN];
char address[MAX];
} Airport;
我为这个结构创建的构造函数没有使用这个结构构建的分配。
sec 有这个结构:
typedef struct
{
Airport* airports;
int maxAPS;
int currentAPS;
} AirportManager;
//constructor
void addAirport(AirportManager* pAirportManager)
{
if (pAirportManager->maxAPS == pAirportManager->currentAPS)
{
pAirportManager->maxAPS++;
pAirportManager->airports = (Airport*)realloc(pAirportManager->airports, sizeof(Airport)*pAirportManager->maxAPS);
//pAirportManager->airports[pAirportManager->currentAPS] = *(Airport*)malloc(sizeof(Airport));
}....
当我结束我的程序并想使用以下代码释放 AirportManager 时:
void freeAirportManager(AirportManager* pAirportManager)
{
for (int i = 0; i < pAirportManager->currentAPS; i++)
free(&pAirportManager->airports[i]);
free(pAirportManager->airports);
}
我已经调试了这个,所有参数都很好,但是在循环中 运行 之后程序退出,我应该在 free 函数中更改什么?
我需要构造函数中的标记行吗?我只是添加了这个,认为它可能有帮助,但似乎效果不佳...我是否只需要释放数组本身?
for (int i = 0; i < pAirportManager->currentAPS; i++)
free(&pAirportManager->airports[i]);
您只需要释放 pAirportManager->airports
。你这里没有指向指针的指针。
所以不是这两行:
free(pAirportManager->airports);
我会使用灵活的数组成员而不是指针。
typedef struct
{
char name[LEN];
char address[MAX];
} Airport;
typedef struct
{
size_t maxAPS;
size_t currentAPS;
Airport airports[];
} AirportManager;
尺寸使用 size_t
类型而不是 int
我在释放动态结构数组时遇到了一些问题,我不明白为什么。
首先是这个结构:
typedef struct
{
char name[LEN];
char address[MAX];
} Airport;
我为这个结构创建的构造函数没有使用这个结构构建的分配。
sec 有这个结构:
typedef struct
{
Airport* airports;
int maxAPS;
int currentAPS;
} AirportManager;
//constructor
void addAirport(AirportManager* pAirportManager)
{
if (pAirportManager->maxAPS == pAirportManager->currentAPS)
{
pAirportManager->maxAPS++;
pAirportManager->airports = (Airport*)realloc(pAirportManager->airports, sizeof(Airport)*pAirportManager->maxAPS);
//pAirportManager->airports[pAirportManager->currentAPS] = *(Airport*)malloc(sizeof(Airport));
}....
当我结束我的程序并想使用以下代码释放 AirportManager 时:
void freeAirportManager(AirportManager* pAirportManager)
{
for (int i = 0; i < pAirportManager->currentAPS; i++)
free(&pAirportManager->airports[i]);
free(pAirportManager->airports);
}
我已经调试了这个,所有参数都很好,但是在循环中 运行 之后程序退出,我应该在 free 函数中更改什么?
我需要构造函数中的标记行吗?我只是添加了这个,认为它可能有帮助,但似乎效果不佳...我是否只需要释放数组本身?
for (int i = 0; i < pAirportManager->currentAPS; i++)
free(&pAirportManager->airports[i]);
您只需要释放 pAirportManager->airports
。你这里没有指向指针的指针。
所以不是这两行:
free(pAirportManager->airports);
我会使用灵活的数组成员而不是指针。
typedef struct
{
char name[LEN];
char address[MAX];
} Airport;
typedef struct
{
size_t maxAPS;
size_t currentAPS;
Airport airports[];
} AirportManager;
尺寸使用 size_t
类型而不是 int