gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:52:08 28 4
gpt4 key购买 nike

我想为 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com