【问题标题】:Char array size when using certain library functions使用某些库函数时的字符数组大小
【发布时间】:2013-04-27 06:48:33
【问题描述】:

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

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

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

    因为此类功能的用户必须deletearray

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

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

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

【问题讨论】:

    标签: arrays function stdstring const-char


    【解决方案1】:

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

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

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

    【讨论】:

    • 我不确定我是否理解 - 你说我可以这样做:std::string buffer; strcpy (buffer.data(), "text");?
    猜你喜欢
    • 2019-12-24
    • 1970-01-01
    • 1970-01-01
    • 2013-08-29
    • 1970-01-01
    • 2018-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多