2

必要な時間情報を文字列形式で取得する関数を作成します。

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);
}

これはエラーなしでコンパイルされ、期待どおりに動作します。
しかし、code:blocks/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) () ()
4

1 に答える 1

5

まず、少なくともからの戻り値を確認する必要がありますstrftime。ゼロが返された場合、バッファは無効であり、そこから文字列を構築しようとするべきではありません。

次に、エラーは多くの場合、この操作の前にnewヒープが破損していたことを意味します。あなたが固執する場合

std::string tmp("heap test");

たとえば、return ステートメントの前で、それが同じように失敗した場合は、間違いなく以前の損傷があります (悲しいことに、これらのことは決定論的ではないことが多いため、逆は当てはまりません)。valgrind またはその他のヒープ チェッカーを使用することをお勧めします。

于 2013-06-03T12:12:45.790 に答える