【问题标题】:Freeing a Dynamically Allocated Array of Structs After Function Return.在函数返回后释放一个动态分配的结构数组。
【发布时间】:2013-07-12 14:49:16
【问题描述】:

我有一个函数可以解析一个文件,并将它的数据放入一个动态分配的结构数组中。该函数返回这个动态分配的用户定义数据类型的数组。 我想释放这个在解析函数中使用的数组,我该怎么做?这是我用来分配数组的代码。

DownloadDescription_t* pDownloads = (DownloadDescription_t*) malloc(MDLFDescription -> uiNumberOfLocations *sizeof(DownloadDescription_t));

DownloadDescription_t 结构体的定义如下:

typedef struct 
{
  UINT uiIndex;
  UINT uiDateAdded;
  char caFileName[129];
  char caUserName[50];
  char caSubsystem[10];
} DownloadDescription_t;

谢谢大家!

【问题讨论】:

  • 顺便说一句,如果这是 C++ 代码,你真的想使用 new,而不是 malloc,除非你用纯 C 代码共享数组。
  • extern "C" 能否成为 c++ 中的 malloc 的片刻?
  • 没有。 extern "C" 是关于链接的。它不会将您的代码转换为 C 代码。
  • 最好还是使用向量,让它自己释放。
  • 此代码与 C 共享。

标签: c++ c pointers malloc


【解决方案1】:

只需使用:

free(pDownloads);

释放数组对象。

对于每个malloc 呼叫,您应该恰好有一个free 呼叫。

【讨论】:

  • 但是请注意,如果数组中的单个 structs 有指针(这里不是这种情况,但在其他情况下需要注意),您应该先遍历数组,然后free() 无论这些指针指向什么(如果这些对象包含指针......你明白了)。
  • 退货前不能释放,否则会丢失数据对吧? pDownloads 元素从此函数返回给 main。如果我没有说清楚,我很抱歉。或者你推荐“代码”免费(pDownloads);返回 pDownloads; '/代码'
  • @DakotaDiehl 当您确定不再需要使用您的阵列时,您应该free
【解决方案2】:

所以,让我们猜一下,你有一个包含你发布的代码的函数,比如

DownloadDescription_t * yourFunctionName( ... )

然后你在 main 中调用它,因为你返回指向 main 的指针,你需要一个值来存储它,就像:

DownloadDescription_t * newName = yourFunctionName( ... );

然后你使用指针和数据做你需要的一切。

毕竟,现在您确定需要清除内存只需使用:free (newname);

好的,现在你可以做其他事情并结束你main

【讨论】:

    猜你喜欢
    • 2017-07-17
    • 2017-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-18
    • 1970-01-01
    相关资源
    最近更新 更多