【问题标题】:free() not working even after I used malloc() to allocate memory即使在我使用 malloc() 分配内存后 free() 也无法工作
【发布时间】:2019-10-31 14:49:05
【问题描述】:

free() 编译时似乎没有释放内存。我之前使用malloc() 进行了分配,并对其进行了测试以确保指针不为空。

这些是我在编译代码时遇到的错误

malloc: * 对象 0x7ffee53e1aa4 的错误:被释放的指针是 未分配 malloc:* 在 malloc_error_break 中设置断点为 调试

void math(int array[], int length, int* sum, int* mult);

int main(void)
{
    int sum = 0;
    int mult = 1 ;
    int a[] = {1, 33, 12, 2, 9, 2};

    int* sump = (int*) malloc(1*sizeof(int));

    if(sump == NULL){
        printf("sump is null");
    }

    int* multp = (int*) malloc(1*sizeof(int));

    if(multp == NULL){
        printf("multp is null");
    }

    sump = ∑
    multp = &mult;

    math(a, 6, sump, multp);

   if(sump != NULL){
       free(sump);
   }
if(multp != NULL){
       free(multp);
   }

    printf("sum: %d mult: %d\n", sum, mult);


    return 0;
}

void math(int array[], int length, int* sump, int* multp)
{
    int i;
    int sum = 1; 
    int mult = 1;

    for(i=0; i<length;++i){
        sum += array[i];
        mult *= array[i];

    }

    printf("%d %d\n", sum, mult);

    *multp = mult;
    *sump = sum;   

}

【问题讨论】:

  • 如果NULL 测试为真,您实际上应该中止程序
  • sump = &amp;sum; 丢失分配的值。你想做什么?
  • sump = &amp;sum; 表示指针sump 现在指向自动变量sum,因此当您尝试释放它时会出错。 free(sump); 表示释放sump 指向的内存。
  • 代码应该是*sump = sum; | *multp = mult;.
  • 这是运行时错误,不是编译时错误。

标签: c malloc free


【解决方案1】:
int* sump = (int*) malloc(1*sizeof(int));

sump 现在指向由malloc 创建的匿名对象。

sump = &sum;

现在sump 指向您之前定义的对象sum。分配的对象丢失了。

if(sump != NULL){
    free(sump);
}

NULL 检查是不必要的,因为free(NULL) 是合法的并且什么都不做。但是由于sump 不再指向分配的对象,free(sump) 具有未定义的行为。 (您很幸运,您的运行时系统能够为您诊断它。)

错误消息是在运行时生成的,而不是在编译时生成的。

而且您在代码顶部缺少必需的 #include 指令:

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

【讨论】:

  • @brhans。不,那不是真的。
  • nvm - 我看到的是双重的。
猜你喜欢
  • 2019-07-20
  • 2016-11-16
  • 2012-02-26
  • 2014-07-17
  • 2021-07-28
  • 2020-04-16
  • 1970-01-01
  • 1970-01-01
  • 2010-12-16
相关资源
最近更新 更多