【问题标题】:Free dynamically alloted memory to struct array containing pointer将动态分配的内存释放到包含指针的结构数组
【发布时间】:2021-08-04 11:32:34
【问题描述】:

我有三个文件

struct.h  struct.c main.c

struct.h 包含结构和一些函数的声明
struct.c 包含全局变量bglobal 的一个实例struct b 和使用bglobal 的函数实现。它包括 .h 文件
main.c 调用 struct.h 中声明的一些函数。它还包括 .h 文件
struct.h 包含两个结构体

struct a{
int *s
}
struct b{
struct a* arr
}
void init();
void more();

struct.c 文件

#include"struct.h"
struct b bglobal;
void init(){
   bglobal.arr = malloc(sizeof(struct a)*5);
}
void more(){
   *bglobal.arr[0].name = 'I';
}

main.c 文件

#include "main.h"
int main(){
init();
more();
}

我希望在分配给bglobal.arr 的程序内存结束时释放它。 使用 valgrind 它说一些字节仍然可以访问。 如何做到这一点?

【问题讨论】:

  • 你试过free(bglobal.arr)吗?
  • init() 中注册一个退出处理程序,在程序退出时释放分配的内存。或者提供一个 uninit() 函数,客户端代码可以调用自己来释放资源。
  • 你可以从你的init函数调用atexit
  • 虽然释放所有已分配的东西更干净,但通常只有 chronic 内存泄漏会导致问题。

标签: arrays c pointers struct memory-leaks


【解决方案1】:

我希望在分配给 bglobal.arr 的程序内存结束时释放它。

init()添加补码函数

int main(){
  init();
  // do stuff
  uninit();  // this functions frees resources.
}

如果struct.h 不允许改进,请在 main.c 中创建一个本地函数。

void uninit(void) {
  extern struct b bglobal; // Take advantage that bglobal is not static
  free(bgolbal.arr);
}

bgolbal.arr = malloc(sizeof(struct b)*5); 分配给错误的类型。 .arrstruct a*。而是分配给引用的对象,因为这样更容易正确编码、查看和维护。

bgolbal.arr = malloc(sizeof *bgolbal.arr * 5);

【讨论】:

  • 我无法向 str.h 添加任何内容。所以这个方法不会起作用,因为 uninit() 将在 str.c 中实现,但不能在 main.c 中引用。
  • @aquib nawaz 在main.cvoid uninit(void) { extern struct b bglobal; free(bgolbal.arr); }。利用bglobal 不是static。或者更好地解决有问题的要求“我不能在 struct.h 中添加任何东西”。因为struct.c 写得不好
  • 这很烦人,但这是作业。
  • @aquib nawaz,然后使用atexit() 方法。随着您编码经验的增长,您会发现需求是可以协商的。不卡住是一个弱设计。
【解决方案2】:

您需要向 struct.c 添加一个清理函数以释放内存。由于您无法从模块外部引用该函数,因此您可以将其设置为 atexit from init,以便在程序退出时调用。

static void cleanup() {
    free(bglobal.arr);
}

void init(){
   bglobal.arr = malloc(sizeof(struct a)*5);
   atexit(cleanup);
}

【讨论】:

  • 鉴于 OP 的限制,这很好 - 除了 sizeof(struct a) 中错误类型的附带问题。我也会 free(bglobal.arr); --> free(bglobal.arr); bglobal.arr = 0; 使用 bglobal.arr 来应对其他潜在的 atexit()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-18
  • 2019-11-30
  • 1970-01-01
  • 2019-04-23
  • 2016-04-01
  • 2017-05-07
  • 2019-10-20
相关资源
最近更新 更多