2013-05-19 2 views
2

Nicolai M. Josuttis의 "C++ 표준 라이브러리 (Second Edition)"152 페이지의 예제를 따르고 있습니다. -153에는 C++ 11에 도입 된 std::chrono::system_clock의 시간, 현재 시간, 최소 시간 및 최대 시간을 인쇄하는 예제가 자세히 설명되어 있습니다.std :: chrono :: system_clock :: time_point :: min()을 문자열로 변환 할 때 잘못된 널 포인터 오류가 발생했습니다.

Microsoft Visual Studio 2012를 사용 중이고 유효하지 않은 널 포인터로 인해 에 트리거 된 어설 션이 발생합니다. 이 아래 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> 라이브러리에, 또는 책의 단지 오타/실수를 설정 한 후 코드의 라인 std::string ts = std::ctime(&t)에 발생? 책에있는 코드를 여러 번 반복하여 잘못 복사했는지 여부를 확인했습니다. 그러나이 경우에는 나타나지 않습니다. 나는 주어진 통찰력에 대해 매우 감사 할 것입니다.

+0

오류를 확인하는 것은 어떻습니까? 'ctime'은 잘 정의 된 인터페이스를 가지고 있습니다. –

답변

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 '값에 대한 포인터 여야한다고 주장하는 곳이면 어디에서든지 찾을 수 있습니까? –

+0

'min()'은 최소 기간을 반환합니다. 그것이 1 나노초라고한다면 아마도'time_t'에서 표현 될 수 없습니다. 'to_time_t()'다음에't' 값은 무엇입니까? – Inspired

+0

디버거는't = -922337203684'라고 말합니다. 이것은'std :: ctime'에 너무 큽니다 (절대 값)? –

관련 문제