0

当使用一些处理字符数组(而不是's)的库函数(例如strftime(),, )时strcpy(),有两个选项:MultiByteToWideChar()std::string

  • 使用固定大小的数组(例如char buffer[256];),由于字符串长度限制,这显然很糟糕
  • 用于new分配所需的大小,当人们想要创建这样的实用函数时,这也很糟糕:

    char * fun(void)
    {
        char * array = new char[exact_required_size];
        some_function(array);
        return array;
    }
    

    因为此类功能的用户必须delete使用array.

如果在使用有问题的函数之前无法知道确切的数组大小/长度(当人们无法预测函数将返回多长时间的字符串时),则第二个选项甚至不总是可能的。

完美的方法是使用std::string它,因为它具有可变长度,并且它的析构函数负责释放内存,但许多库函数只是不支持std::string(它们是否应该是另一个问题)。

好的,那有什么问题?好吧 - 我应该如何使用这些功能?使用固定大小的数组或使用new并让我的函数的用户担心释放内存?或者也许实际上一个我没有想到的顺利解决方案?

4

1 回答 1

0

您可以使用std::string'data()方法获取指向字符数组的指针,该字符数组与string对象中当前包含的字符序列相同。返回的字符指针指向位于内部存储器某处的常量、不可修改的字符数组。您无需担心释放此指针引用的内存,因为string对象的析构函数会自动执行此操作。

但至于您最初的问题:取决于您希望该功能如何工作。如果您正在修改在函数中创建的字符数组,听起来您需要在堆上分配内存并返回指向它的指针。用户必须自己释放内存 - 有很多标准库函数以这种方式工作。

或者,您可以强制用户将字符指针作为参数传递,这将确保他们已经创建了数组并知道他们需要自己释放内存。这种方法使用得更频繁,可能更可取。

于 2013-05-02T23:17:07.590 回答