需要明确的是:我确实知道这一点malloc并free在C库中实现,C库通常从操作系统中分配大块内存并进行自己的管理,将较小的内存分配到应用程序并跟踪分配的字节数.这个问题不是免费如何知道免费的多少.
相反,我想知道为什么free首先这样做.作为一种低级语言,我认为要求C程序员不仅要跟踪分配的内存而且要跟踪多少内容(事实上,我通常发现我最终会跟踪字节数)是完全合理的无论如何都是malloced).在我看来,明确给出字节数free可能允许一些性能优化,例如,具有不同分配大小的单独池的分配器将能够通过查看输入参数来确定要从哪个池中释放,以及总体而言,空间开销会减少.
因此,简而言之,为什么这些malloc和free创造,使得他们必须在内部跟踪的字节数的分配呢?这只是一次历史性事故吗?
一个小编辑:有些人提供了诸如"如果你释放的金额与你分配的金额不同"的分数.我想象的API可能只需要一个就可以完全释放分配的字节数; 释放更多或更少可能只是UB或实现定义.不过,我不想劝阻讨论其他可能性.
我正在编写一个C函数,如果它被malloc()编辑,它将释放一个指针.指针可以是NULL(在发生错误并且代码没有机会分配任何内容的情况下)或分配malloc().使用安全free(ptr);而不是if (ptr != NULL) free(ptr);?
gcc即使有-Wall -Wextra -ansi -pedantic,也不会抱怨,但这是好的做法吗?
似乎有两个论点为什么人们应该NULL在释放它们之后设置指针.
简短:free()不小心召唤第二次,当它被设置为时,不会崩溃NULL.
几乎总是这掩盖了一个逻辑错误,因为没有理由free()第二次调用.让应用程序崩溃并能够修复它会更安全.
它不能保证崩溃,因为有时在同一地址分配新内存.
当有两个指向同一地址的指针时,主要发生双重自由.
逻辑错误也可能导致数据损坏.
短:malloc()除非释放指针设置为,否则访问释放的指针可能会导致数据损坏,如果在同一位置分配内存NULL
NULL如果偏移足够大(someStruct->lastMember,theArray[someBigNumber]),则无法保证在访问指针时程序崩溃.而不是崩溃将导致数据损坏.
将指针设置为NULL无法解决具有相同指针值的不同指针的问题.
随意扩展这个问题.
虽然编程C和GTK +,为什么会"更好"来使用g_strdup_printf,g_free,g_strcmp0等...和同事glib函数?
int main()
{
int x = 0;
free(x);
}
Run Code Online (Sandbox Code Playgroud)
这编译并且似乎是无操作.究竟发生了什么?是这个行为定义的?
谢谢!
假设我在一个程序中遇到一个实例,我要么释放一个NULL指针,要么首先检查它是否为NULL并跳过free()函数调用.
简单地释放NULL指针会更有效吗?我搜索了一下,显然,对于C89之后的实现,释放NULL指针是无害的 - 所以决定归结为效率.
我的假设是,在打电话时可能会产生相当多的开销free().因此,在调用free()函数之前,可能需要进行简单的逻辑检查.
tl;博士版,
在进行调用时,内部发生了什么free(),可能会在释放之前首先检查或指针是否为NULL,从而或多或少有效?
我正在网上寻找安全管理内存分配/释放的一些指导方针.但是找不到一些好的来源.
我想也许在这个网站上堆积一个也许是个好主意.我可以从一些开始,表明我的意思,也许有人可以"改进"它,以便我们有一个完整的指南列表,帮助我们确保(在最大程度上)我们正确地管理内存.
示例:
始终在声明时初始化指针.
int*p = NULL;
Run Code Online (Sandbox Code Playgroud)检查malloc的返回类型
int *p = malloc(sizeof(int));
if(p==NULL)
{
/* do some error handling*/
}
Run Code Online (Sandbox Code Playgroud)每个都malloc应该有对应的free
可能的问题是两次释放内存.怎么避免呢?删除后将指针指定为NULL.
free(p);
p=NULL;
Run Code Online (Sandbox Code Playgroud)
注意:正如注释中所指出的,如果一个对象有两个指针,这就无法保护.它已经使用其中一个指针释放了.
否则,如果遵循这些指导原则,这似乎是非常安全的方式来管理我的内存.
有任何想法吗?建议?
我试图理解atomic_forced_read定义的目的,它经常出现在malloc.c的GNU libc实现中。
我不太擅长内联汇编,但看起来这会返回完全相同的值,并且类型与输入值相同。我在这里缺少什么?
原子强制读取定义在atomic.h中
523 #ifndef atomic_forced_read
524 # define atomic_forced_read(x) \
525 ({ __typeof (x) __x; __asm ("" : "=r" (__x) : "0" (x)); __x; })
526 #endif
Run Code Online (Sandbox Code Playgroud)
链接到atomic.h
https://code.woboq.org/userspace/glibc/include/atomic.h.html
我正在尝试在开源项目中使用C中的链表实现队列.我已经实现了Queue,编写了单元测试,并使用valgrind解决了大部分内存泄漏问题.
现在的问题是,我一直试图找到这几个小时的最后8个字节的泄漏,我似乎无法弄明白.
这是valgrind的输出:
==25806== 8 bytes in 1 blocks are definitely lost in loss record 1 of 1
==25806== at 0x402BE68: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==25806== by 0x80484E3: node_create (in /home/karysto/c-datastructures/queue/tests.out)
==25806== by 0x8048511: enqueue (in /home/karysto/c-datastructures/queue/tests.out)
==25806== by 0x8048851: test_dequeue_updates_size (in /home/karysto/c-datastructures/queue/tests.out)
==25806== by 0x8048978: test_suite (in /home/karysto/c-datastructures/queue/tests.out)
==25806== by 0x80489B0: main (in /home/karysto/c-datastructures/queue/tests.out)
==25806==
==25806== LEAK SUMMARY:
==25806== definitely lost: 8 bytes in 1 blocks
==25806== indirectly lost: 0 bytes in 0 blocks
==25806== possibly lost: 0 bytes in …Run Code Online (Sandbox Code Playgroud) 什么是需要使用空指针正确执行的应用程序示例?只需检查空指针并进行测试就不算数了.这个例子应该被C程序员"常用".
经过一番思考,我有一个可能的例子,但我不想影响答案(还).
编辑:这个问题是一个编程工作的访谈,需要知识而不是C语言中的神似技巧.答案不会是语言的一些深奥的方面.