【问题标题】:Does a string created with 'strcpy' need to be freed?是否需要释放使用“strcpy”创建的字符串?
【发布时间】:2011-06-30 22:41:17
【问题描述】:

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

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

char* buffer[LEN];

【问题讨论】:

  • 是什么让你认为strcpy 创建了一个字符串?
  • 我希望这不是缓冲区的声明 - char* buffer 或 char buffer[LEN] - 不是两者都应该是 LEN+1
  • char * 缓冲区 [LEN];分配一个指向 char 的指针数组(具有 LEN 大小)。 ¿ 你确定这是你想用作 strcpy 目的地吗?
  • 您可能会发现将项目转换为垃圾收集语言(如 Java 或 C#)更容易。除非您对内存分配/释放 100% 感到满意,否则您只是在尝试用 C/C++ 编写代码时遇到麻烦。

标签: c strcpy


【解决方案1】:

strcpy 本身并不为目标字符串分配内存,所以,不,它不必被释放。

当然,如果 else 为它分配了内存,那么,是的,该内存最终应该被释放,但这与strcpy 无关

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

char* buffer[LEN];

几乎肯定会做到:

buffer[n] = malloc (length);

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

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

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

【讨论】:

    【解决方案2】:

    如果你使用

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

    例如,当缓冲区到达其范围的末尾时,将被释放。

    另一方面,

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            猜你喜欢
            • 2022-01-04
            • 2011-11-14
            • 1970-01-01
            • 2015-09-05
            • 2012-09-17
            • 2011-07-01
            • 2014-01-21
            • 1970-01-01
            • 2014-09-23
            相关资源
            最近更新 更多