由另一个流修改的word()值

时间:2015-04-02 15:43:00

标签: c++ stream manipulators

os.pword(index)方法应该返回自定义操纵器指定的当前日期格式。然而, pword()的结果由其 str(string)方法的不同流修改。

ostringstream os;
istringstream is;
CDate f ( 2000, 5, 12 );

os << date_format ( "%Y-%m-%d" ) << f;
is.clear ();
is.str ( "05.06.2003" ); // causes pword() to return "05.06.2003" instead of "%Y-%m-%d"
os.str ("");
os << f;

班级方法:

struct date_format
{
    static const int index;
    string format;

    explicit date_format(const char * fmt)
    {
        format = string(fmt);
    }

    friend ostream & operator<<(ostream & s, const date_format & df)
    {
        s.pword(index) = (void*)df.format.c_str();
        return s;
    }

};

const int date_format::index = ios_base::xalloc();

class CDate
{
    ...
    friend ostream & operator<<(ostream & os, const CDate & cdate)
    {
        /* should point to the current date format of os */ 
        const char * ptr = (const char*)os.pword(date_format::index);
        ...
        return os;
    }
}

是什么导致了这种行为以及可以采取哪些措施来避免这种行为?

1 个答案:

答案 0 :(得分:0)

您正在体验未定义的behvaior。在operator<<(ostream & s, const date_format& df)中,您将s.pword(index)设置为指向临时date_format实例的数据成员的指针。由于date_format( "%Y-%m-%d" )在表达式的末尾析构,因此您的流会留下一个悬空指针。

在设置指向它的指针之前,尝试制作字符串的深层副本。