首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用"time.h“时崩溃

使用"time.h“时崩溃
EN

Stack Overflow用户
提问于 2013-12-17 13:26:36
回答 2查看 833关注 0票数 2

==FINAL类在LINE==下面

这不是std::ostringstream的问题,我用"time.h"做坏事,但我没有完全理解。原来的问题出现在课后。最后一节课如下所示:

时间戳p.h

代码语言:javascript
复制
#ifndef __TIMESTAMP_H
#define __TIMESTAMP_H

#include <string>
#include "time.h"


class CTimestamp {

    private:
        std::string timestamp;
        time_t rawtime;
        struct tm errorTime;
        struct tm tempTime;
        bool quality;

    public:
        CTimestamp();
        void set(std::string inputTime);
        std::string get();
        std::string get(int modifiedBy);
        bool good();

        void getWeekday();  // Mainly for testing purposes - if this returns
                            // the correct weekday for your modified timestamp,
                            // you probably modified it correctly.
};

#endif

timestamp.cpp

代码语言:javascript
复制
#include "timestamp.h"
#include "time.h"
#include <string>
#include <stdlib.h>
#include <iostream>
#include <sstream>

CTimestamp::CTimestamp(){

    quality = 0;
}

void CTimestamp::set(std::string inputTime){

    quality = 1;

    int year, month, day, hour, minute, second;

    if (19 == inputTime.length()){

        inputTime.replace(10,1," ");
        inputTime.replace(13,1,":");
        inputTime.replace(16,1,":");

        year = atoi(inputTime.substr(0,4).c_str());
        month = atoi(inputTime.substr(5,2).c_str());
        day = atoi(inputTime.substr(8,2).c_str());
        hour = atoi(inputTime.substr(11,2).c_str());
        minute = atoi(inputTime.substr(14,2).c_str());         
        second = atoi(inputTime.substr(17,2).c_str());

        timestamp = inputTime;
    }
    else{
        quality = 0;
    }

    if(quality){
        // Get current time with the "time_t time(struct tm * timeptr)" function from time.h
        time(&rawtime);

        // Change to local time with "struct tm * localtime (const time_t * timer)" function from time.h
        errorTime = *localtime(&rawtime);

        // Change to the time of the timestamp
        errorTime.tm_year = year - 1900;   //Years since 1900
        errorTime.tm_mon  = month - 1;     //Months since january
        errorTime.tm_mday = day;           //Day of the month
        errorTime.tm_hour = hour;      //Hours since midnight
        errorTime.tm_min  = minute;        //minutes since hour
        errorTime.tm_sec  = second;        //Seconds since minute

        // modifies errorTime so overflows in lower units increment higher units then sets tm_wday and tm_yday
        mktime ( &errorTime );
    }
}

void CTimestamp::getWeekday(){

    const char * weekday[] = {"sun", "mon", "tue", "wed", "thu", "fri", "sat"};
    std::cout << weekday[errorTime.tm_wday];
}

std::string CTimestamp::get(){
    std::string returnValue = "Bad Initialization";
    if(quality){
        returnValue = timestamp;
    }
    return returnValue;
}

std::string CTimestamp::get(int modifiedBy){

    std::string returnValue = "Bad Initialization";
    if(quality){

        tempTime = errorTime;
        tempTime.tm_sec = (errorTime.tm_sec+modifiedBy);
        mktime( &tempTime);

        std::string year, month, day, hour, minute, second;

        // This compiler does not support the C++11 std::to_string but there is a workaround with stringstreams
        // http://www.cplusplus.com/articles/D9j2Nwbp/
        year   = static_cast<std::ostringstream*>( &(std::ostringstream() << (tempTime.tm_year+1900)) )->str();
        month  = static_cast<std::ostringstream*>( &(std::ostringstream() << (tempTime.tm_mon+1)) )->str();
        day    = static_cast<std::ostringstream*>( &(std::ostringstream() << (tempTime.tm_mday)) )->str();
        hour   = static_cast<std::ostringstream*>( &(std::ostringstream() << (tempTime.tm_hour)) )->str();
        minute = static_cast<std::ostringstream*>( &(std::ostringstream() << (tempTime.tm_min)) )->str();
        second = static_cast<std::ostringstream*>( &(std::ostringstream() << (tempTime.tm_sec)) )->str();

        if(month.length()  == 1) { month  = "0" + month;  }
        if(day.length()    == 1) { day    = "0" + day;    }
        if(hour.length()   == 1) { hour   = "0" + hour;   }
        if(minute.length() == 1) { minute = "0" + minute; }
        if(second.length() == 1) { second = "0" + second; }

        returnValue = year+"-"+month+"-"+day+" "+hour+":"+minute+":"+second;
    }

    return returnValue;
}

bool CTimestamp::good(){

    return quality;
}

==ORIGINAL问题从LINE==下面开始

我需要一些custome时间戳功能,我正在尝试为它创建一个类。不幸的是,当我试图调用其中一个函数时,它会使我的程序崩溃,我不太确定为什么,特别是考虑到当我在一个较小的玩具程序中使用它来测试类时,它不会崩溃。

代码语言:javascript
复制
#ifndef __TIMESTAMP_H
#define __TIMESTAMP_H

#include <string>
#include "time.h"
#include "debug.h"

class CTimestamp {

    private:
        std::string timestamp;
        time_t rawtime;
        struct tm * errorTime;
        struct tm * tempTime;
        bool quality;

    public:
        CTimestamp();
        void set(std::string inputTime);
        std::string get();
        std::string get(int modifiedBy);
        bool good();

        void getWeekday();  // Mainly for testing purposes - if this returns
                            // the correct weekday for your modified timestamp,
                            // you probably modified it correctly.
};

#endif

这个问题发生在我打电话的时候

代码语言:javascript
复制
std::cout << timeStamp.get(-30);

具体而言,在这一点上:

代码语言:javascript
复制
year   = static_cast<std::ostringstream*>( &(std::ostringstream() << (tempTime->tm_year+1900)) )->str();

这是以下方法的一部分:

代码语言:javascript
复制
std::string CTimestamp::get(int modifiedBy){
    if ( 1 < __DEBUG__ ){std::cout << "\nDEBUG " << __FILE__ << " " << __FUNCTION__ << " " << __LINE__ ;}

    std::string returnValue = "Bad Initialization";
    if(quality){

        tempTime->tm_year  = errorTime->tm_year;
        tempTime->tm_mon   = errorTime->tm_mon;
        tempTime->tm_mday  = errorTime->tm_mday;
        tempTime->tm_hour  = errorTime->tm_hour;
        tempTime->tm_min   = errorTime->tm_min;
        tempTime->tm_sec   = errorTime->tm_sec;
        mktime(tempTime);

        tempTime->tm_sec = tempTime->tm_sec + modifiedBy;
        mktime(tempTime);

        std::string year, month, day, hour, minute, second;

        if ( 1 < __DEBUG__ ){std::cout << "\nDEBUG " << __FILE__ << " " << __FUNCTION__ << " " << __LINE__ ;}

        // This compiler does not support the C++11 std::to_string but there is a workaround with stringstreams
        // http://www.cplusplus.com/articles/D9j2Nwbp/
        year   = static_cast<std::ostringstream*>( &(std::ostringstream() << (tempTime->tm_year+1900)) )->str();
        month  = static_cast<std::ostringstream*>( &(std::ostringstream() << (tempTime->tm_mon+1)) )->str();
        day    = static_cast<std::ostringstream*>( &(std::ostringstream() << (tempTime->tm_mday)) )->str();
        hour   = static_cast<std::ostringstream*>( &(std::ostringstream() << (tempTime->tm_hour)) )->str();
        minute = static_cast<std::ostringstream*>( &(std::ostringstream() << (tempTime->tm_min)) )->str();
        second = static_cast<std::ostringstream*>( &(std::ostringstream() << (tempTime->tm_sec)) )->str();

        if ( 1 < __DEBUG__ ){std::cout << "\nDEBUG " << __FILE__ << " " << __FUNCTION__ << " " << __LINE__ ;}

        if(month.length() == 1)
        {
            month = "0" + month;
        }
        if(day.length() == 1)
        {
            day = "0" + day;
        }
        if(hour.length() == 1)
        {
            hour = "0" + hour;
        }
        if(minute.length() == 1)
        {
            minute = "0" + minute;
        }
        if(second.length() == 1)
        {
            second = "0" + second;
        }

        if ( 1 < __DEBUG__ ){std::cout << "\nDEBUG " << __FILE__ << " " << __FUNCTION__ << " " << __LINE__ ;}

        returnValue = year+"-"+month+"-"+day+" "+hour+":"+minute+":"+second;

        if ( 1 < __DEBUG__ ){std::cout << "\nDEBUG " << __FILE__ << " " << __FUNCTION__ << " " << __LINE__ ;}

    }

    if ( 1 < __DEBUG__ ){std::cout << "\nDEBUG " << __FILE__ << " " << __FUNCTION__ << " " << __LINE__ ;}

    return returnValue;
}

编辑

好吧,这让我很奇怪:

当我打电话的时候

代码语言:javascript
复制
std::cout << timeStamp.get();

它在我指示的线路上崩溃了。

当我去的时候

代码语言:javascript
复制
std::string hey = timeStamp.get();
std::cout << hey;

它在第二个__DEBUG__语句上崩溃(就在if(quality)之后)

编辑编辑

errorTime在这里初始化:

代码语言:javascript
复制
void CTimestamp::set(std::string inputTime){

    quality = 1;

    int year, month, day, hour, minute, second;

    if (19 == inputTime.length()){

        inputTime.replace(10,1," ");
        inputTime.replace(13,1,":");
        inputTime.replace(16,1,":");

        year = atoi(inputTime.substr(0,4).c_str());
        month = atoi(inputTime.substr(5,2).c_str());
        day = atoi(inputTime.substr(8,2).c_str());
        hour = atoi(inputTime.substr(11,2).c_str());
        minute = atoi(inputTime.substr(14,2).c_str());         
        second = atoi(inputTime.substr(17,2).c_str());

        timestamp = inputTime;
    }
    else{
        quality = 0;
    }

    if(quality){
        // Get current time with the "time_t time(struct tm * timeptr)" function from time.h
        time(&rawtime);

        // Change to local time
        errorTime = localtime(&rawtime);

        // Change to the time of the timestamp
        errorTime->tm_year = year - 1900;   //Years since 1900
        errorTime->tm_mon  = month - 1;     //Months since january
        errorTime->tm_mday = day;           //Day of the month
        errorTime->tm_hour = hour;          //Hours since midnight
        errorTime->tm_min  = minute;        //minutes since hour
        errorTime->tm_sec  = second;        //Seconds since minute

        // modifies errorTime so overflows in lower units increment higher units then sets tm_wday and tm_yday
        mktime ( errorTime );
    }
}

编辑

我试着摆脱花哨的指针工作,让它占用更多的几行。不幸的是,它似乎不起作用:

代码语言:javascript
复制
    /*
    year   = static_cast<std::ostringstream*>( &(std::ostringstream() << (tempTime->tm_year+1900)) )->str();
    month  = static_cast<std::ostringstream*>( &(std::ostringstream() << (tempTime->tm_mon+1)) )->str();
    day    = static_cast<std::ostringstream*>( &(std::ostringstream() << (tempTime->tm_mday)) )->str();
    hour   = static_cast<std::ostringstream*>( &(std::ostringstream() << (tempTime->tm_hour)) )->str();
    minute = static_cast<std::ostringstream*>( &(std::ostringstream() << (tempTime->tm_min)) )->str();
    second = static_cast<std::ostringstream*>( &(std::ostringstream() << (tempTime->tm_sec)) )->str();
    */

    int timeConvertINT;
    std::ostringstream timeConvertOSS;

    timeConvertINT = (tempTime->tm_year)+1900;
    timeConvertOSS << timeConvertINT;
    year = timeConvertOSS.str();

    timeConvertINT = (tempTime->tm_mon)+1;
    timeConvertOSS << timeConvertINT;
    month = timeConvertOSS.str();

    timeConvertINT = (tempTime->tm_mday);
    timeConvertOSS << timeConvertINT;
    day = timeConvertOSS.str();

    timeConvertINT = (tempTime->tm_hour);
    timeConvertOSS << timeConvertINT;
    hour = timeConvertOSS.str();

    timeConvertINT = (tempTime->tm_min);
    timeConvertOSS << timeConvertINT;
    minute = timeConvertOSS.str();

    timeConvertINT = (tempTime->tm_sec);
    timeConvertOSS << timeConvertINT;
    second = timeConvertOSS.str();

编辑编辑

哈。所以看起来,ostreamstring并不是这里的罪魁祸首--即使当我将所有OSS功能都删除,并且只是硬编码一个回复时,它也会在这一行崩溃。

这意味着在这个块中:

代码语言:javascript
复制
if(quality){

    if ( 1 < __DEBUG__ ){std::cout << "\nDEBUG " << __FILE__ << " " << __FUNCTION__ << " " << __LINE__ ;}

    tempTime->tm_year  = errorTime->tm_year;
    tempTime->tm_mon   = errorTime->tm_mon;
    tempTime->tm_mday  = errorTime->tm_mday;
    tempTime->tm_hour  = errorTime->tm_hour;
    tempTime->tm_min   = errorTime->tm_min;
    tempTime->tm_sec   = errorTime->tm_sec;
    mktime(tempTime);

    if ( 1 < __DEBUG__ ){std::cout << "\nDEBUG " << __FILE__ << " " << __FUNCTION__ << " " << __LINE__ ;}

    tempTime->tm_sec = tempTime->tm_sec + modifiedBy;
    mktime(tempTime);

    std::string year, month, day, hour, minute, second;

    if ( 1 < __DEBUG__ ){std::cout << "\nDEBUG " << __FILE__ << " " << __FUNCTION__ << " " << __LINE__ ;}

    year = "2013";
    month = "11";
    day = "05";
    hour = "12";
    minute = "00";
    second = "00";

当我将第一个调试输出调用为

代码语言:javascript
复制
std::string hey = timeStamp.get();
std::cout << hey;

但当我称之为

代码语言:javascript
复制
std::cout << timeStamp.get();

我在后面看到调试输出。

代码语言:javascript
复制
std::string year, month, day, hour, minute, second;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-17 14:37:11

神秘的崩溃和指针一起运行,所以在取消引用之前,请检查tempTimeerrorTime是否指向有效对象。发布的代码没有显示初始化tempTime的位置,所以这是开始查找的地方。

除了将值赋值给指针之外,当您使用指针时,还要确保对象的生存期仍然有效。您不希望保存指向已超出作用域的临时对象的指针。

票数 3
EN

Stack Overflow用户

发布于 2013-12-17 13:42:55

这段代码“似乎”是合法的,但在形式上--实际上是不正确的--因为你的地址是临时的。&(std::ostringstream() << (tempTime->tm_year+1900))

您可以很容易地避免它--只需编写(std::ostringstream() << (tempTime->tm_year+1900)).str()。如果它仍然崩溃--尝试给std::ostringstream()一个名称,如

代码语言:javascript
复制
std::ostringstream() oss;
oss << (tempTime->tm_year+1900);
oss.str();

如果这也无济于事的话-我现在没什么主意了。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20635413

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档