内存泄漏结构char C.

时间:2018-02-08 00:26:05

标签: c memory struct

我想我在这里有一些记忆泄漏 也许有人可以告诉我如何在这种情况下处理泄漏的正确方法。

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

struct adresse {
    char *name;
    int nummer;
};

int main() {

    int size = 2;
    struct adresse *a = (struct adresse *) malloc(sizeof(struct adresse) * size);

    for (int i = 0; i < size; i++) {
        a[i].name = "Testname";
        a[i].nummer = 123;
    }

    for (int i = 0; i < size; i++) {
        printf("%s, %d\n", a[i].name, a[i].nummer);
    }

    free(a);

    return 0;
}

2 个答案:

答案 0 :(得分:3)

  

我想我这里有一些内存泄漏。也许有人可以告诉我如何在这种情况下处理泄漏的正确方法。

在你编写的动态分配内存的任何代码中,你有2个职责关于任何分配的内存块:(1)总是保留一个指向起始地址的指针内存块,(2)当不再需要时,它可以释放

如果您分配它,请跟踪它,并在不再需要它时free。如果您没有分配它,则不能free它。如果您已经释放它,则不能再free

  

“如果参数与之前由内存管理函数返回的指针不匹配,或者如果通过调用free或realloc释放了空间,则行为未定义。”

C11 §7.22.3.3 The free function [p2] (n1570 draft)

您分配的唯一内容是a,之后您可以免费a - 您没有内存泄漏

示例内存使用/错误检查

通过使用内存使用/错误检查程序(例如Linux上的valgrind - 您可以轻松确认是否有内存泄漏 - 每个操作系统都有类似的程序)。它们易于使用,只需通过它运行程序:

$ valgrind ./bin/leak
==23745== Memcheck, a memory error detector
==23745== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==23745== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
==23745== Command: ./bin/leak
==23745==
Testname, 123
Testname, 123
==23745==
==23745== HEAP SUMMARY:
==23745==     in use at exit: 0 bytes in 0 blocks
==23745==   total heap usage: 1 allocs, 1 frees, 32 bytes allocated
==23745==
==23745== All heap blocks were freed -- no leaks are possible
==23745==
==23745== For counts of detected and suppressed errors, rerun with: -v
==23745== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

始终确认已释放已分配的所有内存并且没有内存错误。

注意,取决于您的操作系统及其valgrind的实现,它可能会显示系统为您的进程在程序退出时仍在使用的内存分配。并非所有实现{ {1}}提供适当的抑制文件来掩盖操作系统为您的进程分配的所有内存,而不是您。只要您确认已分配的内存已被释放 - 您已完成工作。)

从上面的valgrind输出中可以看出,您没有错误,并且已释放所有已分配的内存。 (干得好!)

答案 1 :(得分:-1)

你也应该malloc Testname字符串。它使得释放所有内容变得有点复杂,因为你需要首先释放所有Testname字符串,然后释放整个struct memory。

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

struct adresse {
  char *name;
  int nummer;
};

int main() {

    int size = 2;
    struct adresse *a = (struct adresse *) malloc(sizeof(struct adresse) * size);

    for (int i = 0; i < size; i++) {
      char *str = "Testname";
      size_t len = strlen(str);
      a[i].name = malloc(len+1);
      memset(a[i].name, 0, len+1);
      memcpy(a[i].name, str, len);
      a[i].nummer = 123;
    }

    for (int i = 0; i < size; i++) {
        printf("%s, %d\n", a[i].name, a[i].nummer);
        free(a[i].name);
    }

    free(a);

    return 0;
}