使用交流功能分配内存是否安全

cod*_*imp 0 c malloc memory-management

我想创建一个函数,它将生成任意长度的数据并返回数组.数据的内存将从数组中分配.我知道下面的简单测试代码会分配并返回指针,但我不知道的是,如果以后通过另一个调用此函数或其他函数而被覆盖是安全的.

#include <stdio.h>

float* CreateFloatArray(unsigned int N) {
    float *array = (float*) malloc(N*sizeof(float));
    return array;
}

int main() {
   float *a = CreateFloatArray(10);
//   free(a);
   float *b = CreateFloatArray(10);

   printf ("%d %d\n",a,b);
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

需要明确的是,这段代码不是我的实际应用程序,而是一个简单的测试.

最后,测试代码打印两个已分配内存块的地址.如果我free(a)在两次调用之间插入命令,则a和b的地址相同; 否则,他们相距甚远.

很明显,这个简单的测试工作在分配不同的内存块,没有重叠,但我正在寻找保证,从更有知识的人,在整个程序执行过程中永远不会有内存重叠,无论我有多少次叫这个功能?(当然,了解到函数内部的粗心malloc是泄漏内存的好方法).

Sou*_*osh 7

是的,分配动态内存并将指针返回给调用者函数是安全的.由于动态内存分配器API [ malloc()和系列]从全局堆"对象"获取内存,因此即使在不同位置的调用也不会分配相同的内存或重叠,因为它们都使用全局堆"对象"进行协调.因此,除非您正在free()使用内存,否则任何其他对malloc()/的调用都不会再次分配该内存calloc().

也就是说,还有两件事要提.

  1. 无需强制转换返回值malloc().
  2. malloc()在使用返回的指针之前,请务必检查是否成功.

还有,printf ("%d %d\n",a,b);错了.您需要使用%p格式说明符来打印指针(内存地址).

#感谢Mooing Duck先生的评论.

  • 我认为要提到的关键是`malloc`从全局堆"对象"获取内存,因此即使在不同的地方调用也不会分配相同的内存或重叠,因为它们都使用全局堆"对象进行协调" ". (2认同)
  • @DAhrens:有时候,但大部分时间没有.Visual Studio和G ++以及Clang都在C运行时实现了全局堆,这很容易看出,因为当你删除/释放内存时,很少会将内存返回给操作系统. (2认同)