c++ - 字符串操作和内存管理

标签 c++ string memory-management char type-conversion

我想为 C 风格函数编写一个方便的包装器 strftime .我已经找到了一些将字符数组转换为字符串的选项,反之亦然。这是我的代码:

std::string Time::getAsFormattedString ( const std::string& format , const size_t& maxStringSize = 999 )
{

    char* timeArray = 0;
    std::string timeString;

    //  [OPTION_0]
    timeArray = reinterpret_cast <char*> (malloc(sizeof(char)*maxStringSize)));

    //  [OPTION_1]
    timeArray = const_cast <char*> (timeString.c_str());

    //  [OPTION_2]
    timeArray = &(*(timeString.begin()));

    strftime(timeArray,maxStringSize,format.c_str(),&this->time);
    timeString = timeArray;

    //  [OPTION_0]
    free(timeArray);

    return timeString;

}

№0 选项看起来很安全,因为在释放内存之前不会抛出任何异常(编辑:timeString = timeArray 可以抛出一个,该行需要 try-catch)

№1 const-casting 总是看起来像 hack

№2 似乎是最好的,我不知道它是否有问题

能否请您告诉我,哪一个是最安全、正确、最佳且可能是最佳实践。

谢谢。

最佳答案

您提出的选项都不是真正可以接受的;这 第二个和第三个甚至不会工作。在全局范围内,有两种 “可接受的”解决方案。

最简单的是:

char buffer[ 1000 ];
size_t n = strftime( buffer, sizeof( buffer ), format.c_str(), &time );
if ( n == 0 ) {
    throw SomeError;    //  or you might just abort...
}
return std::string( buffer );

这有简单的优点,但你必须 将最大大小记录为界面中的约束。 (这对我来说似乎是一个合理的约束。)

或者,您可以删除约束:

std::vector<char> buffer( 100 );
size_t n = strftime( &buffer[0], buffer.size(), format.c_str(), &time );
while ( n == 0 ) {
    buffer.resize( 2 * buffer.size() );
    n = strftime( &buffer[0], buffer.size(), format.c_str(), &time );
}
return std::string( buffer.begin(), buffer.begin() + n );

(在 C++11 中,实际上在 C++03 中,您可以使用 std::string 直接,而不是 std::vector。其中 在这种情况下,您需要对结果字符串调用 resize( n ) 在归还之前。)

关于c++ - 字符串操作和内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17208490/

相关文章:

c++ - 在 C++ 中组合 char 和 Vector

c++ - 具有类作用域的动态分配堆栈内存

java - 什么时候首选 `StringBuilder` 而不是将 `String` append 到 `String` ?

c++ - 仅从 std::cin 获取第一个值

C++ 基于整数对返回字符串

c++ - imshow() 在 C++ 中使用 OpenCV 3.2 产生奇怪的结果

iOS 将 IP 地址转换为整数并向后转换

c - 在 C 中,指针值更改后内存值会发生什么情况?

c - 如何在 Linux 上设置没有 root 权限的可编程 ram 磁盘

c++ - 如何在 C++ 中从 9222*9222 二维数组创建一个大的特征矩阵