等号是不是在 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】:
不,您应该只为通过malloc
、calloc
或realloc
分配的对象调用free
。
"words"
是一个具有静态存储持续时间的对象,您无法释放该对象。
【讨论】:
【参考方案2】:无需致电free()
。事实上,它会失败。像这样声明的字符串常量不在堆上,无论如何都会在程序的整个生命周期中存在。
在您的程序使用malloc()
等分配的内存上调用free()
。
【讨论】:
尚不清楚free()
是否真的会失败。该行为将是未定义的,这意味着它可能看起来“有效”。事实上free()
函数没有办法告诉你它失败了;是否正确调用它是你的责任。
我想我并没有将“看起来工作”视为实际工作。不会释放任何内存。对我来说,这就是失败。
你为什么断言不会释放内存?对free()
的无效调用完全有可能 释放一些内存——而不是已正确分配的内存。行为未定义;它可以合法地吹口哨迪克西。
free()
管理一个堆。如果您将地址传递给不在堆中的内存,那么要么 A)它会识别出内存不在堆中并且什么都不做,或者 B)它会修改堆外的内存。在这两种情况下,都没有任何内存被释放。
或 C) 它可以以某种完全任意的方式运行,不限于任何有意义的事情。例如,它可以将(非堆)内存添加到空闲列表中,并使其可用于将来的分配。由于行为是未定义的,因此谈论它不做什么确实比谈论它做什么没有更多的基础。【参考方案3】:
如果我使用以下代码
char * foo = "words"
。我应该先打电话给free()
:foo = "two words";
。
没有。 free
的参数必须是先前由 malloc
、calloc
或 realloc
函数返回的指针。否则它将调用未定义的行为。
这个任务是如何工作的?
当编译器遇到长度为n
的字符串文字时,它会为字符串留出n+1
字节的内存。 char
指针在分配字符串字面量时指向已分配内存的第一个字节。
一旦存储在内存中,字符串文字就可以在程序的整个生命周期内使用。
如果将"two words"
后者分配给foo
,那么word
仍将继续存储在该部分,但该部分与malloc
分配的位置不同。
【讨论】:
ok ,但是 char 指针之前指向的数据会发生什么变化?即“词”。它会立即从堆栈中弹出吗? @worlboss:我在回答中提到了这个问题。 @worlboss;字符串文字可用于程序的生命周期。查看更新。以上是关于等号是不是在 char * 中重新分配内存?的主要内容,如果未能解决你的问题,请参考以下文章