12

是否需要释放使用“ strcpy ”创建的字符串?以及如何释放它?

编辑:目的地是这样分配的:

char* buffer[LEN];
4

5 回答 5

20

strcpy它本身不会为目标字符串分配内存,因此,不,它不必被释放。

当然,如果其他东西为其分配了内存,那么,是的,该内存最终应该被释放,但这strcpy.

前面的语句似乎是这种情况,因为您的定义是字符指针数组而不是字符数组:

char* buffer[LEN];

几乎肯定会通过以下方式完成:

buffer[n] = malloc (length);

开始考虑分配内存的责任是一个好主意。我的意思是,传递一个 malloc 的内存块也可能涉及传递在某个时候释放它的责任。

您只需要弄清楚(或决定,如果它是您的代码)管理内存的责任是否与内存本身有关。使用strcpy,即使您为目的地传递了一个已经分配好的块,责任也没有被传递,因此您仍然必须自己释放该内存。这使您可以轻松地传入 malloc'ed 或 non-malloc'ed 缓冲区,而不必担心它。

您可能在想,strdup这基本上是通过首先为其分配内存来复制字符串。从那里返回的字符串肯定需要被释放。

于 2011-02-21T00:58:01.210 回答
7

如果你使用

char buffer[6];
strcpy(buffer, "hello");

例如,当缓冲区到达其作用域的末尾时,它就会被释放。

另一方面,

char *buffer;
buffer = malloc(sizeof(char) * 6);
strcpy(buffer, "hello");

这样你需要释放你分配的内存。

但它实际上与 strcpy 没有任何关系,仅与您如何分配字符串有关。

于 2011-02-21T07:13:49.673 回答
5

您为 strcpy 提供了一个指向目标缓冲区的指针,因此它取决于您如何分配该缓冲区,以及是否需要释放它以及如何释放它。

例如,如果您使用 malloc 分配缓冲区,那么是的,您需要释放它。如果你在堆栈上分配了缓冲区,那么你不会,它会在超出范围时自动释放。

于 2011-02-20T22:51:23.470 回答
2

strcpy函数将字符串复制到您需要以其他方式获取的缓冲区中(例如malloc);您应该使用适合您分配方式的任何机制来释放该缓冲区。

于 2011-02-20T22:51:02.413 回答
1

strcpy()不创建字符串,它只复制一个字符串。内存分配与该过程完全分离。

因此,您必须注意将字符串复制到的内存 - 如果它是动态分配的,您必须在某个时候释放它。由于您似乎有一个堆栈分配的缓冲区,因此您不必做任何特别的事情 - 缓冲区超出范围时将被回收。

于 2011-02-21T07:53:40.950 回答