【问题标题】:Does a pointer inside a struct get freed automatically when the struct variable is destroyed?当结构变量被销毁时,结构内部的指针是否会自动释放?
【发布时间】:2023-01-27 00:00:39
【问题描述】:

我有这样的东西:-

struct Pos {
    float x, y;
};
struct Rect {
    struct Pos* pos;
    int width, height;
};

我创建了一个指针长方形,所以当我使用 free() 释放这个指针时,它也会释放位置

【问题讨论】:

  • Entity 是什么意思?
  • 不。 ___________
  • 快速回答:没有。在 C 语言中,不会自动释放任何东西,您可以释放通过 malloc 和类似函数分配的任何东西。
  • @GovindParmar 抱歉,有一些错误,但我现在已经更正了。
  • 由程序动态分配的内存也将在程序结束时由操作系统释放。虽然是事实,但不是推荐的方法。

标签: c pointers


【解决方案1】:

不;您手动分配的所有内容,您都手动取消分配。这使得动态 2D(和更多)数组的编码有些乏味,需要:

 int **array = malloc(NUM_ROWS * sizeof(int *));
 if(NULL == array)
 {
     // Handle out of memory error
 }
 for(int i = 0; i < NUM_ROWS; i++)
 {
     array[i] = malloc(NUM_COLS * sizeof(int));
     if(NULL == array[i])
     {
         // Handle out of memory error
     }
 }

要分配,则:

for(int i = 0; i < NUM_ROWS; i++)
{
    free(array[i]);
    array[i] = NULL;
}
free(array);
array = NULL;

解除分配。如果您手动分配pos,则在解除分配其父结构Rect之前手动解除分配pos,如果它在其中:

free(someRect.pos);
someRect.pos = NULL;
free(someRect);
someRect = NULL;

我总是在 freeing 或 deleteing (C++) 之后设置指向 NULL(ptr) 的指针。

【讨论】:

  • 谢谢,很有帮助!
  • 如果在分配 for 循环的中途出现内存分配失败,则进行清理是很繁琐的(但这是避免泄漏所必需的)。
【解决方案2】:

我创建了一个 Rect 指针,所以我什么时候释放这个指针 使用 free(),那么它也会释放 pos 吗?


假设指向 struct Rect 的指针是使用内存分配函数之一在堆上分配的,不。它会只要free() 指向 struct 的指针。

free()指向struct的指针之前,您必须free()指针pos,否则您将无法访问通过pos分配的内存,并泄漏内存。

【讨论】:

  • 即使不做假设,分配的struct Rect *free() 也只会释放结构,而不是嵌套指针。 “假设”子句实际上是关于您是否可以完全释放指针,而不是嵌入式指针是否也将被释放。我可能会选择“假设指向 struct Rect 的指针是通过内存分配函数之一在堆上分配的(以便可以合法地释放它),那么 free() 只会释放用于该结构的内存被指着”或类似的东西。
猜你喜欢
  • 2017-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多