C++ stringstream的第一个字符串参数保存为指针/垃圾

C++ stringstream的第一个字符串参数保存为指针/垃圾,c++,pointers,stringstream,memory-address,C++,Pointers,Stringstream,Memory Address,可能重复: 我正在尝试使用stringstream构建一个字符串,就像使用cout一样。这是一个日志类。我遇到的问题是,如果的第一个参数似乎是实例化对象的方式的结果。我仍在调查中(同时您可能会得到更好的答案),但显式实例化对象效果很好: #include <iostream> #include <sstream> class StreamWriter { public: StreamWriter() {} ~StreamWriter() { std:

可能重复:


我正在尝试使用stringstream构建一个字符串,就像使用cout一样。这是一个日志类。我遇到的问题是,如果的第一个参数似乎是实例化对象的方式的结果。我仍在调查中(同时您可能会得到更好的答案),但显式实例化对象效果很好:

#include <iostream>
#include <sstream>

class StreamWriter {
public:
    StreamWriter() {}
    ~StreamWriter() { std::cout << m_stringstream.str() << std::endl; }
    std::stringstream m_stringstream;
};

int main (void) {
    StreamWriter *sw = new StreamWriter();
    sw->m_stringstream << "Hello " << "my " << "name is Pris ";
    delete sw;
    return 0;
}
并确保您的作用域保护命令,使其不会尝试创建多个
sw
,并确保它在正确的时间被销毁,与您最初的尝试相同:

{ ORSDEBUG  << "Hello " << "my " << "name is Pris"; }

{ORSDEBUG我已经尝试了几个替代方案,我唯一能做的就是这样:

#define OSRDEBUG(s)                 \
    do                              \
    {                               \
        StreamWriter writer;        \
        writer.m_stringstream << s; \
    } while (0)

OSRDEBUG("Hello " << "my " << "name is Pris " << 123456);
#定义OSRDEBUG\
做\
{                               \
流作者\

writer.m_stringstream老实说,我不太清楚到底发生了什么(这与您的
StreamWriter
实例是临时实例有关),但我看到了与GCC和MSVC中描述的paxdiablo相同的效果

但是,这里有一些方法可以解决这个问题。将以下帮助程序添加到您的
StreamWriter
类中:

    ostream& get_ostream() {
        return m_stringstream;
    }
并将宏更改为:

#define OSRDEBUG (StreamWriter().get_ostream())

问题确实是,这条流是暂时的


在C++11之前,没有非成员的
运算符感谢您花时间进行调查!我正在通过宏进行实例化,因为我需要调用析构函数。在我给出的示例代码中,我只是将消息的内容打印到std::cout,但我打算在析构函数中的某个点使用字符串执行其他操作,我希望这就是我为什么这么做的原因。+1感谢你打败了我。@Jon:我真不敢相信这个问题“没有答案”一个多小时。:@xeo:我也不能,但我有以前问过这个问题的好处;)@Matthieu:我觉得这个问题以前有人问过,我想我记得是你的问题。哦,看来你的问题也是重复的!:)太好了——谢谢你的回答!有什么理由不使用
#定义OSRDEBUG吗td::cout
?@Xeo:啊,捕捉得很好,就在几周前,我也问了我的问题。不过,我已经“重定向”到了我的问题上,因为Nawaz在解释根本原因和解决问题方面做得很好。或者干脆做
StreamWriter().flush()
。您已经有了一个返回
ostream&
的函数,除此之外,它本质上是一个no op。没有理由编写新函数。
#define ORSDEBUG StreamWriter sw; sw.m_stringstream
{ ORSDEBUG  << "Hello " << "my " << "name is Pris"; }
#define OSRDEBUG(s)                 \
    do                              \
    {                               \
        StreamWriter writer;        \
        writer.m_stringstream << s; \
    } while (0)

OSRDEBUG("Hello " << "my " << "name is Pris " << 123456);
    ostream& get_ostream() {
        return m_stringstream;
    }
#define OSRDEBUG (StreamWriter().get_ostream())
basic_ostream<Ch, Traits>& operator<<(void* p);