释放后重新分配指针变量

时间:2017-08-22 06:17:50

标签: c pointers free dynamic-memory-allocation

这合法吗?你可以在释放后将ptr分配给某个东西吗?

int * ptr = (int*) malloc(sizeof(int));
free(ptr);
ptr = (int *) malloc(sizeof(int));

8 个答案:

答案 0 :(得分:25)

在释放指针后,您无法重新指定指针,而只是重用ptr变量。这很好。

答案 1 :(得分:7)

首先,正如我在评论中所提到的,please see this discussion on why not to cast the return value of malloc() and family in C..

那说,是的,(重新)分配在这里很好。

实际上,问题措辞

  

您可以在释放后将ptr分配给某些内容吗?

应该阅读

  

您可以在释放后将ptr 分配给某些人吗?

猜猜是什么,没有free - ing的作业也是 legal ,但是它会创建一个memory leak副作用作为变量{{1保存内存分配器函数的返回值,一旦你使用它就需要释放内存。如果在不保留指针副本的情况下重新分配指针,则您将失去对分配器功能分配的内存的访问权限,并且无法ptr它。

如果指针持有静态分配变量的地址,则不能( nned to )释放它并直接重新分配完全没问题。想想下面的片段。

free()

答案 2 :(得分:6)

是。它在C语言中是有效的。

相关堆栈溢出问题以获取更多信息:Reusing freed pointers in C

根据cwe.mitre.org

  

在这种情况下,将有问题的内存分配给另一个内存   指针在被释放后的某个时刻有效。原本的   再次使用指向释放内存的指针并指向某处   在新的分配中。随着数据的变化,它会破坏数据   有效使用的记忆; 这会在过程中引发未定义的行为

答案 3 :(得分:5)

  

这合法吗?你可以在释放后将ptr分配给某个东西吗?

是的,这是合法的。 ptr可以根据需要重新分配。释放该指针对于重新分配不是必需的,例如

int * ptr = malloc(sizeof(int));
int *temp_ptr = ptr;         // temp_ptr is pointing to the location ptr is pointing
ptr = malloc(sizeof(int));   // ptr points to new location.

请注意,您不应转换malloc的返回值。

答案 4 :(得分:5)

  

你可以在释放后将ptr分配给某个东西吗?

int * ptr = (int*) malloc(sizeof(int)); /* line 1 */
free(ptr); /* line 2 */
ptr = (int *) malloc(sizeof(int)); /* line 3 */

将您的问题视为:

在指针从先前的动态分配(第1行)指向的内存被释放后,将新近动态分配的内存的地址分配给指针(第3行)是否合法(第2行) ?

然后这个答案是肯定的。

第3行也是有效的没有有第2行。但是,如果没有调用free()(第2行),则分配给ptr的值(第1行)被覆盖(第3行),这样就有可能在free()的初始值上调用ptr,这反过来又使程序漏掉了最初分配的内存。

答案 5 :(得分:3)

是的,您正在堆上分配新内存及其合法内容。

我建议你改用realloc

对于realloc()失败的情况,来自,章节§7.22.3.5,

  

如果是新对象,则realloc函数返回...空指针   无法分配。

  

[....]如果新对象的内存无法分配,则为旧   对象未被释放,其值不变。

使用realloc的正确方法是

ptr_new = realloc(ptr, sizeof(int)*2);
if (ptr_new == NULL)
{
    free(ptr);
}

另请阅读why should i not cast return value of malloc

答案 6 :(得分:3)

是。这完全合法。 ptr是一个独立变量,无论其内容如何都会继续存在。存储ptr的内存位置没有任何反应。没有什么可以阻止您为其分配任何值。内存分配的正确性(malloc / realloc等)是一个不同的故事,但重用变量(内存位置)来存储内存位置的地址没有错。

答案 7 :(得分:2)

当您声明指针时,它将为其分配一个内存位置。该位置可以重新分配。

如果在为malloc()调用分配了值之后再重新分配它,并且在free()之前,这是内存泄漏。在free()之后,您可以重新分配它并且不会发生泄漏,请不要再忘记free()

事实上,从未完成的有用程序的操作系统将一直重新分配一些固定的指向进程,在进程完成时释放它们等等。

不允许分配的编程称为functional programming