C ++,strftime to string

时间:2013-06-03 11:00:48

标签: c++

我使用这样的函数以字符串形式获取所需的时间信息。

string gettimeinfo()
{
    tm * timeinfo;
    time_t rawtime;
    char timebuff[120] = {0};
    time(&rawtime);
    timeinfo = localtime(&rawtime);
    strftime(timebuff, 120, "%d.%m.%Y. %H:%M:%S %x %W %I:%M %p %a %b %A %B %Z\n", timeinfo);
    return string(timebuff);
}

编译时没有错误,并按预期工作 但是在调试代码时:块/ GCC程序在return语句处停止并出现调试警告:

In std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&) () ()

会发生什么以及如何摆脱这种情况?

编辑:整个错误是:

In std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, unsigned int, std::allocator<char> const&) () ()
#1  0x004013fe in gettimeinfo () at C:\programi\[connectcpp\general.cpp:36
C:\programi\[connectcpp\general.cpp:36:785:beg:0x4013fe
At C:\programi\[connectcpp\general.cpp:36
In char* std::string::_S_construct<char const*>(char const*, char const*, std::allocator<char> const&, std::forward_iterator_tag) () ()
In std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) () ()
In operator new(unsigned int) () ()

1 个答案:

答案 0 :(得分:5)

首先,您应该至少检查strftime的返回值。如果它返回零,则缓冲区无效,您不应尝试从中构造字符串。

其次,new中的错误通常意味着在此操作之前您的堆已损坏。如果坚持

std::string tmp("heap test");
例如,在返回语句之前

,并且以同样的方式失败,你肯定会有一些先前的损害(遗憾的是反过来不是真的,因为这些事情往往不是确定性的)。使用valgrind或其他堆检查器是一个更好的选择。