【问题标题】:How do I free() a non-heap object?如何释放()非堆对象?
【发布时间】:2020-12-24 02:41:43
【问题描述】:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int** intptrArray;
char word[50];

在随后的函数中使用 malloc 分配它们后,我试图在数组和 word 上使用 free()。 free(intptrArray) 似乎工作得很好,但每次我尝试 free(word)、free(*word) 或 free(&word) 时,我都会收到错误 - 最常见的是“尝试释放非堆对象”。

我该如何解决这个问题?蒂亚!

【问题讨论】:

  • 您为什么要这样做?释放 word 后,您预计会发生什么?
  • 只能释放malloc()calloc()realloc()等返回的内存
  • 请在Minimal Reproducible Example 上发布完整的代码,显示您如何使用malloc()free(),而不是假设和描述。

标签: c string char malloc free


【解决方案1】:

如何释放非堆对象?你没有。

free 的目的是使分配的堆内存可用于程序的其他用途。所以你应该只传递从malloc/calloc/realloc返回的指针值到free

【讨论】:

  • 哦,我明白了。因此,即使我使用 malloc 为 word 分配空间,我也不需要“释放”/释放该内存?
  • @AlexiosNaval 如果你这样做了,那么是的。但是,因为您将其定义为 char word[50];,这意味着您没有。
  • @AlexiosNaval 您无法使用 malloc 为 word 分配空间
【解决方案2】:

在我分配后试图在数组和word上使用free() 他们在此之后的函数中使用 malloc

您似乎不明白函数如何接受具有数组类型的参数。

我可以猜到你正在做的看起来类似于下面的程序。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void f( char word[] )
{
    word = malloc( 50 * sizeof( char ) );
    strcpy( word, "Hello World!" );
    
    puts( word );
}

int main(void) 
{
    char word[50] = "Bye!";

    f( word );
    
    puts( word );
    
    return 0;
}

程序输出

Hello World!
Bye!

如您所见,数组word 没有更改。在函数中,您没有更改 main 中声明的数组 word。当您将数组传递给函数f 时,它会隐式转换为char * 类型的指针。这个指针(参数)是函数的局部变量。所以你改变了局部变量。在 main 中声明的数组本身既没有更改也没有重新分配。它具有自动存储持续时间,并且是编译器将在函数 main 执行完成后释放声明的数组。

另一方面,函数f的参数word指向的分配内存确实必须被释放。否则会出现内存泄漏。它可以在函数内完成,例如

void f( char word[] )
{
    word = malloc( 50 * sizeof( char ) );
    strcpy( word, "Hello World!" );
    
    puts( word );

    free( word );
}

【讨论】:

    猜你喜欢
    • 2021-07-23
    • 2011-07-30
    • 1970-01-01
    • 1970-01-01
    • 2013-06-08
    • 2021-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多