将std::chrono::system_clock::time_point::min()转换为字符串时出现无效的空指针错误 我在Nicolai M. Josuttis的“C++标准库(第二版)”页152-153中详细介绍了一个例子,它是打印 STD::C++中的Cytho::StulySythCyth 11的时间、当前时间、最小和最大时间。
我正在使用Microsoft Visual Studio 2012,由于无效的空指针,在将std::chrono::system_clock::time_point::min()转换为字符串时出现无效的空指针错误 我在Nicolai M. Josuttis的“C++标准库(第二版)”页152-153中详细介绍了一个例子,它是打印 STD::C++中的Cytho::StulySythCyth 11的时间、当前时间、最小和最大时间。,c++,visual-studio-2012,c++11,stl,chrono,C++,Visual Studio 2012,C++11,Stl,Chrono,我正在使用Microsoft Visual Studio 2012,由于无效的空指针,在中触发了一个断言。在设置tp=std::chrono::system\u clock::time\u point::min()后,在下面代码中的行std::string ts=std::ctime(&t)上会发生这种情况 #包括 #包括 #包括 #包括 标准::字符串关联(常数标准::时钟::系统时钟::时间点和tp) { std::time\u t=std::chrono::system\u clock::
中触发了一个断言。在设置tp=std::chrono::system\u clock::time\u point::min()后,在下面代码中的行std::string ts=std::ctime(&t)
上会发生这种情况代码>
#包括
#包括
#包括
#包括
标准::字符串关联(常数标准::时钟::系统时钟::时间点和tp)
{
std::time\u t=std::chrono::system\u clock::to\u time\u t(tp);
std::string ts=std::ctime(&t);
ts.resize(ts.size()-1);
返回ts;
}
int main()
{
标准::时钟::系统时钟::时间点tp;
std::cout它看起来像std::ctime
返回NULL,这表示一个不正确的t
值。可能是因为对asString
的调用使用了time\u point
类型中无法表示的time\u t
值。那么,检查错误如何?ctime
有一个定义良好的接口e、 为什么会是这种情况呢?在Dinkumware的实现中,time\u t
是\u int64
(一个64位有符号整数)的类型定义,所以当std::chrono::system\u clock::time\u point::min()
结果为负时间
我找不到任何地方表明std::ctime
的参数必须是指向非负时间
值的指针?min()
返回最短持续时间。如果它是1纳秒,它可能无法在时间\u t
中表示。在到\u时间\u t()之后的t
值是什么?
?调试器声明t=-922337203684
,我猜可能太大(绝对值)对于std::ctime
?是的,我想ctime
无法处理此问题。我不确定MS VC的实现,但通常时间t是从1970年1月1日起经过的秒数。对于“t”的值,它类似于公元前28000年。
#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;
}