等号是不是在 char * 中重新分配内存?

Posted

技术标签:

【中文标题】等号是不是在 char * 中重新分配内存?【英文标题】:Does the equal sign reallocate memory in a char *?等号是否在 char * 中重新分配内存? 【发布时间】:2014-07-03 17:38:54 【问题描述】:

如果我使用以下代码char * foo = "words"。我应该先打电话给free()foo = "two words"; 。这个任务是如何工作的? 是否释放了包含字符串“word”的内存,然后分配了足够的内存来保存字符串“two words”,然后将 foo 设置为指向新字符串。我只是想确保我的代码尽可能高效并且没有任何内存泄漏。

【问题讨论】:

如果你调用malloc(或者如果你调用的函数调用了),那么你应该调用free。如果你不打电话给malloc,你就不应该打电话给free 确保阅读字符串文字和字符缓冲区,以及不同类型的存储持续时间。 char *foo 只是一个指针。 foo 实际上并没有保存字符串,对它的赋值不会分配或取消分配任何东西——它只是改变了它指向的内容。 【参考方案1】:

不,您应该只为通过malloccallocrealloc 分配的对象调用free

"words" 是一个具有静态存储持续时间的对象,您无法释放该对象。

【讨论】:

【参考方案2】:

无需致电free()。事实上,它会失败。像这样声明的字符串常量不在堆上,无论如何都会在程序的整个生命周期中存在。

在您的程序使用malloc() 等分配的内存上调用free()

【讨论】:

尚不清楚free() 是否真的会失败。该行为将是未定义的,这意味着它可能看起来“有效”。事实上free() 函数没有办法告诉你它失败了;是否正确调用它是你的责任。 我想我并没有将“看起来工作”视为实际工作。不会释放任何内存。对我来说,这就是失败。 你为什么断言不会释放内存?对free() 的无效调用完全有可能 释放一些内存——而不是已正确分配的内存。行为未定义;它可以合法地吹口哨迪克西。 free() 管理一个堆。如果您将地址传递给不在堆中的内存,那么要么 A)它会识别出内存不在堆中并且什么都不做,或者 B)它会修改堆外的内存。在这两种情况下,都没有任何内存被释放 或 C) 它可以以某种完全任意的方式运行,不限于任何有意义的事情。例如,它可以将(非堆)内存添加到空闲列表中,并使其可用于将来的分配。由于行为是未定义的,因此谈论它不做什么确实比谈论它做什么没有更多的基础。【参考方案3】:

如果我使用以下代码char * foo = "words"。我应该先打电话给free()foo = "two words";

没有。 free 的参数必须是先前由 malloccallocrealloc 函数返回的指针。否则它将调用未定义的行为

这个任务是如何工作的?

当编译器遇到长度为n 的字符串文字时,它会为字符串留出n+1 字节的内存。 char 指针在分配字符串字面量时指向已分配内存的第一个字节。

一旦存储在内存中,字符串文字就可以在程序的整个生命周期内使用。 如果将"two words" 后者分配给foo,那么word 仍将继续存储在该部分,但该部分与malloc 分配的位置不同。

【讨论】:

ok ,但是 char 指针之前指向的数据会发生什么变化?即“词”。它会立即从堆栈中弹出吗? @worlboss:我在回答中提到了这个问题。 @worlboss;字符串文字可用于程序的生命周期。查看更新。

以上是关于等号是不是在 char * 中重新分配内存?的主要内容,如果未能解决你的问题,请参考以下文章

malloc在函数内分配内存问题

c++ 在 for 循环中的 vector<char> 中的 for 循环中的内存分配

重新分配新分配的内存是不是安全?

函数内的指针变量指向堆栈还是堆?

为啥指针分配的内存在函数之后仍然存在,而不是数组?

多个指向C中重新分配的内存块的指针