【问题标题】:Strange behaviour from references in an output stream输出流中引用的奇怪行为
【发布时间】:2013-10-17 21:49:51
【问题描述】:

我注意到在将输出打印到流时出现了奇怪的行为。我的代码遍历一个大型数据集,除其他外,从每个项目中读取时间戳。存储第一项的时间戳,以便计算经过的时间。

CurTime = ev[i].MidasTimeStamp;
RunTimeElapsed = difftime(CurTime,StartTime);
cout << "StartTime: " << ctime(&StartTime) << "CurTime: " << ctime(&CurTime) << "Elapsed: " << RunTimeElapsed << " s" << endl;  

打印到屏幕的输出显示同一时间打印两次例如:

StartTime: Mon Sep 23 14:44:57 2013
CurTime: Mon Sep 23 14:44:57 2013
Elapsed: 360 s

但如果将打印行一分为二:

cout << "StartTime: " << ctime(&StartTime); 
cout << "CurTime: " << ctime(&CurTime) << "Elapsed: " << RunTimeElapsed << " s" << endl; 

我得到了预期的输出:

StartTime: Mon Sep 23 14:44:57 2013
CurTime: Mon Sep 23 14:50:57 2013
Elapsed: 360 s

两个输出之间的唯一变化是 cout 行。这很容易解决,但我想了解发生了什么。

【问题讨论】:

    标签: c++ cout time.h


    【解决方案1】:

    来自ctime上的文档:

    返回值指向一个内部数组,其有效性或值 可以通过任何后续调用 asctime 或 ctime 来更改。

    表达式中子表达式的求值顺序未指定。特别是,编译器可以先调用两次ctime,然后根据需要调用operator&lt;&lt;。这就是您的情况似乎发生的情况。

    【讨论】:

    • 非常感谢,我真的在那个问题上摸不着头脑。很抱歉我在文档中错过了这一点。
    • @Carl 那么,当您自己不调用free() 时,您认为ctime() 返回指针所引入的内存泄漏究竟是怎么回事?
    • @oswald 多么令人讨厌的回应方式!我认为从我最初的问题中可以清楚地看出, ctime() 返回指针的重要性已经让我忘记了。谢天谢地,其他人提供了有用的答案。
    • @Carl 请原谅我看似令人讨厌的回应方式。我只是想指出,每当从函数返回指针时,您应该格外小心谁负责释放该内存。
    猜你喜欢
    • 1970-01-01
    • 2015-09-10
    • 1970-01-01
    • 1970-01-01
    • 2015-01-09
    • 1970-01-01
    • 1970-01-01
    • 2014-07-09
    • 1970-01-01
    相关资源
    最近更新 更多