将std :: chrono :: system_clock :: time_point :: min()转换为字符串时出现无效的空指针错误

3

我正在跟随Nicolai M. Josuttis的《C++标准库(第二版)》第152-153页中的示例,该示例详细介绍了如何打印C++11引入的std::chrono::system_clock的时代、当前时间、最小和最大时间。

我正在使用Microsoft Visual Studio 2012,并在<xstring>中触发了一个断言,原因是无效的空指针。这发生在下面的代码中的std::string ts = std::ctime( &t )一行上,此前设置了tp = std::chrono::system_clock::time_point::min();

#include <chrono>
#include <ctime>
#include <string>
#include <iostream>

std::string asString( const std::chrono::system_clock::time_point& tp )
{
    std::time_t t = std::chrono::system_clock::to_time_t( tp );
    std::string ts = std::ctime( &t );
    ts.resize( ts.size()-1 );
    return ts;
}

int main()
{
    std::chrono::system_clock::time_point tp;
    std::cout << "epoch: " << asString(tp) << std::endl;

    tp = std::chrono::system_clock::now();
    std::cout << "now: " << asString(tp) << std::endl;

    tp = std::chrono::system_clock::time_point::min();
    std::cout << "min: " << asString(tp) << std::endl;

    tp = std::chrono::system_clock::time_point::max();
    std::cout << "max: " << asString(tp) << std::endl;

    return 0;
}

这是因为Dinkumware在<chrono>库中实现错误,还是书中的错别字/错误?我一遍又一遍地检查了书中给出的代码,看是否我复制错误,但似乎并非如此。如果有任何见解,我将不胜感激。


那么,如何检查错误呢? ctime有一个定义良好的接口。 - Kerrek SB
1个回答

1
似乎 std::ctime 返回了 NULL,这表明 t 值不正确。可能是因为调用 asString 时使用了一个无法表示为 time_t 类型的 time_point 值。

1
但这为什么会是这种情况呢?在Dinkumware的实现中,time_t__int64(一个64位有符号整数)的typedef,因此,尽管std::chrono::system_clock::time_point::min()导致负的time_t,但我找不到任何地方说明std::ctime的参数必须是指向非负time_t值的指针? - Thomas Russell
min() 返回最小持续时间。如果它是1纳秒,可能无法在 time_t 中表示。to_time_t()t的值是多少? - nullptr
调试器显示t = -922337203684,我猜这个值(绝对值)可能太大了,超出了std::ctime的范围? - Thomas Russell
1
是的,我猜测 ctime 无法处理这个。我不确定 MS VC 的实现,但通常 time_t 是自 1970 年 01.01 起经过的秒数。对于这个值 't',它大约相当于公元前 28000 年。 - nullptr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接