我想我在这里有一些记忆泄漏
也许有人可以告诉我如何在这种情况下处理泄漏的正确方法。
#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;
}
答案 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;
}