如何释放非堆对象?

问题描述

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

int** intptrArray;
char word[50];

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

我该如何解决? TIA!

解决方法

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

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

,

在分配后试图在数组和单词上都使用free()

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

我可以猜到您在做什么与以下程序类似。

#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完成执行后释放声明的数组。

另一方面,实际上必须释放函数word的参数f所指向的已分配内存。否则会发生内存泄漏。可以在功能内完成,例如

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

    free( word );
}