当使用一些处理字符数组的库函数(例如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
并让我的函数用户担心释放内存?或者实际上 是一个我没想过的顺利解决方案?
答案 0 :(得分:0)
您可以使用std::string
的{{3}}方法获取指向字符数组的指针,该字符数组具有string
对象中当前包含的相同字符序列。返回的字符指针指向位于内部存储器中某个位置的常量不可修改的字符数组。您无需担心释放此指针引用的内存,因为string
对象的析构函数会自动执行此操作。
但是关于你原来的问题:取决于你希望函数如何工作。如果您正在修改在函数中创建的字符数组,则听起来您需要在堆上分配内存并返回指向它的指针。用户必须自己释放内存 - 有很多标准库函数以这种方式工作。
或者,您可以强制用户将字符指针作为参数传入,这将确保他们已经创建了数组,并且知道他们需要自己释放内存。该方法使用得更频繁,可能更可取。