释放后重新分配指针变量

skm*_*ey1 15 c free pointers dynamic-memory-allocation

这合法吗?ptr它可以在被释放后分配给它吗?

int * ptr = (int*) malloc(sizeof(int));
free(ptr);
ptr = (int *) malloc(sizeof(int));
Run Code Online (Sandbox Code Playgroud)

Mur*_*nik 24

释放后你没有重新分配指针,你只是重用ptr变量.这很好.

  • 你可能想要改写一下 - 代码重新分配指针(但这确实不是问题). (6认同)

Sou*_*osh 7

首先,正如我在评论中提到的,请参阅此讨论,了解为什么不在C中强制转换malloc()和family的返回值.

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

实际上,问题的措辞

ptr它可以在被释放后分配给它吗?

应该读

你可以指定ptr 一些已经被释放之后?

猜猜看,没有free-ing 的赋值也是合法的,但是它会产生内存泄漏作为副作用,因为变量ptr保存了内存分配器函数的返回值,你需要释放内存一旦你是完成后使用它.如果你不保持指针的拷贝重新分配的指针,你将失去获得通过分配函数分配的内存,将有没有办法free()了.

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

int x = 5, y = 10;
int * p = &x;
//do something with p
p = &y; //this is fine, just a re-assignment.
Run Code Online (Sandbox Code Playgroud)


msc*_*msc 6

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

有关更多信息的相关堆栈溢出问题:在C中重用已释放的指针

根据cwe.mitre.org:

在这种情况下,有问题的内存在释放后的某个时刻有效地分配给另一个指针.再次使用指向释放内存的原始指针,并指向新分配中的某个位置.随着数据的改变,它会破坏有效使用的内存; 这会导致过程中出现未定义的行为.

  • 该引文并不真正支持您的答案,并且实际上令人困惑,因为它的背景是在链接背后.我建议你删除它.此外,请不要过度使用重点,因为它使文本更难阅读. (6认同)
  • 在"free"之后将指针设置为NULL在这种情况下完全无关紧要. (4认同)

hac*_*cks 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.
Run Code Online (Sandbox Code Playgroud)

请注意,您不应该转换返回值malloc.


alk*_*alk 5

ptr它可以在被释放后分配给它吗?

int * ptr = (int*) malloc(sizeof(int)); /* line 1 */
free(ptr); /* line 2 */
ptr = (int *) malloc(sizeof(int)); /* line 3 */
Run Code Online (Sandbox Code Playgroud)

将您的问题视为:

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

那么这个答案是肯定的.


运行线3也将是有效的,而不具有运行线2尽管如此,如果不调用free()(线2),分配给所述值ptr(线1)被覆盖(第3行),以及与此可能性调用free()ptr的初始值丢失了,这反过来使程序泄漏了最初分配的内存.