在我的公司中,有一个编码规则,在释放任何内存后,将变量重置为NULL.例如 ...
void some_func ()
{
int *nPtr;
nPtr = malloc (100);
free (nPtr);
nPtr = NULL;
return;
}
Run Code Online (Sandbox Code Playgroud)
我觉得,在上面显示的代码中,设置为NULL没有任何意义.或者我错过了什么?
如果在这种情况下没有任何意义,我将采用"质量团队"来删除此编码规则.请指教.
任何人都可以解释malloc()内部如何运作
我有时会这样做strace program,我看到很多sbrk系统调用,正在man sbrk讨论它的使用情况,malloc()但不多.
在一个项目中,有人推动了这一行:
double (*e)[n+1] = malloc((n+1) * sizeof(*e));
Run Code Online (Sandbox Code Playgroud)
据推测,这会创建一个(n + 1)*(n + 1)双倍的二维数组.
据说,我说,因为到目前为止,我没有人问我能告诉我它的作用,确切地说,它起源于何处或为什么它应该起作用(据称,它确实如此,但我还没有购买它).
也许我错过了一些明显的东西,但如果有人能够向我解释上述内容,我会很感激.因为就个人而言,如果我们使用我们真正理解的东西,我会感觉好多了.
如果我malloc在我的代码中使用:
int *x = malloc(sizeof(int));
Run Code Online (Sandbox Code Playgroud)
我收到以下警告gcc:
new.c:7: warning: implicit declaration of function ‘malloc’
new.c:7: warning: incompatible implicit declaration of built-in function ‘malloc’
Run Code Online (Sandbox Code Playgroud) 我正在审查其他人使用MPI进行高性能计算(10 ^ 5 - 10 ^ 6核心)的项目的C++代码.该代码旨在允许不同体系结构上(可能)不同机器之间的通信.他写了一条评论,说的是:
我们通常使用
new和delete,但在这里我正在使用malloc和free.这是必要的,因为一些编译器在new使用时将以不同方式填充数据,从而导致在不同平台之间传输数据时出错.这不会发生malloc.
这与我从标准newvs malloc问题中所知道的任何内容都不符合.
new/delete和malloc/free有什么区别?提示编译器可以不同地计算对象的大小(但那么为什么它与使用不同sizeof?).
malloc&placement new vs. new是一个相当受欢迎的问题,但只讨论new使用构造函数而malloc不是,这与此无关.
malloc如何理解对齐?他说保证记忆与任何一个new或者malloc我之前想过的一致.
我的猜测是,他在过去的某个时间误诊了自己的错误并推断出new并malloc提供不同数量的填充,我认为这可能不是真的.但我无法通过谷歌或以前的任何问题找到答案.
帮助我,StackOverflow,你是我唯一的希望!
有人告诉我,以下代码在 C++20 之前具有未定义的行为:
int *p = (int*)malloc(sizeof(int));
*p = 10;
Run Code Online (Sandbox Code Playgroud)
真的吗?
论点是int对象的生命周期在为其分配值之前没有开始(P0593R6)。要解决此问题,new应使用放置:
int *p = (int*)malloc(sizeof(int));
new (p) int;
*p = 10;
Run Code Online (Sandbox Code Playgroud)
我们真的必须调用一个微不足道的默认构造函数来启动对象的生命周期吗?
同时,代码在纯 C 中没有未定义的行为。但是,如果我int在 C 代码中分配 an并在 C++ 代码中使用它呢?
// C source code:
int *alloc_int(void)
{
int *p = (int*)malloc(sizeof(int));
*p = 10;
return p;
}
// C++ source code:
extern "C" int *alloc_int(void);
auto p = alloc_int();
*p = 20;
Run Code Online (Sandbox Code Playgroud)
它仍然是未定义的行为吗?
需要明确的是:我确实知道这一点malloc并free在C库中实现,C库通常从操作系统中分配大块内存并进行自己的管理,将较小的内存分配到应用程序并跟踪分配的字节数.这个问题不是免费如何知道免费的多少.
相反,我想知道为什么free首先这样做.作为一种低级语言,我认为要求C程序员不仅要跟踪分配的内存而且要跟踪多少内容(事实上,我通常发现我最终会跟踪字节数)是完全合理的无论如何都是malloced).在我看来,明确给出字节数free可能允许一些性能优化,例如,具有不同分配大小的单独池的分配器将能够通过查看输入参数来确定要从哪个池中释放,以及总体而言,空间开销会减少.
因此,简而言之,为什么这些malloc和free创造,使得他们必须在内部跟踪的字节数的分配呢?这只是一次历史性事故吗?
一个小编辑:有些人提供了诸如"如果你释放的金额与你分配的金额不同"的分数.我想象的API可能只需要一个就可以完全释放分配的字节数; 释放更多或更少可能只是UB或实现定义.不过,我不想劝阻讨论其他可能性.
我在Objective-C中编写应用程序,我收到此错误:
MyApp(2121,0xb0185000)malloc:***对象0x1068310的错误:double free
***在malloc_error_break中设置断点以进行调试
当我发布一个NSAutoreleasePool并且我无法弄清楚我要发布两次的对象时,就会发生这种情况.
我该如何设置他的断点?
有没有办法知道这个"对象0x1068310"是什么?
也许从平台到平台不同,但是
当我使用gcc编译并运行下面的代码时,我每次都在ubuntu 11.10中得到0.
#include <stdio.h>
#include <stdlib.h>
int main()
{
double *a = (double*) malloc(sizeof(double)*100)
printf("%f", *a);
}
Run Code Online (Sandbox Code Playgroud)
为什么malloc表现得像这样,即使有calloc?
是不是意味着只是将值初始化为0会产生不必要的性能开销,即使您有时不想要它也是如此?
编辑:哦,我之前的例子不是initiazling,但碰巧使用"新鲜"块.
我正在寻找的是为什么它在分配一个大块时初始化它:
int main()
{
int *a = (int*) malloc(sizeof(int)*200000);
a[10] = 3;
printf("%d", *(a+10));
free(a);
a = (double*) malloc(sizeof(double)*200000);
printf("%d", *(a+10));
}
OUTPUT: 3
0 (initialized)
Run Code Online (Sandbox Code Playgroud)
但感谢您指出在进行mallocing时存在安全原因!(没想过).当分配新块或大块时,它必须初始化为零.
malloc ×10
c ×7
c++ ×2
free ×2
gcc ×2
allocation ×1
arrays ×1
autorelease ×1
c++20 ×1
coding-style ×1
heap-memory ×1
iphone ×1
linux ×1
memory ×1
new-operator ×1
objective-c ×1
padding ×1
sbrk ×1
sizeof ×1
system-calls ×1
warnings ×1