为什么通过指针调用std :: stringstream的good()导致崩溃?

问题描述:

我遇到了stringstream对象的问题。我的班级有一个输入流作为成员。 我正在检查如果obj-> istream并在那之后如果obj-> istream-> good()。为什么通过指针调用std :: stringstream的good()导致崩溃?

流存在,但调用good()会崩溃。我在Visual Studio 2005中。任何线索?

如何重置istream?


if (soap->is) { 

    if (soap->is->good()) 

     return soap->is->read(s, (std::streamsize)n).gcount(); 

    return 0; 
} 

该代码是从gSOAP的框架


std::istringstream in_stream; 
in_stream.str("a buffer"); 
soap->is = &in_stream; 

的in_stream超出范围,它属于一个局部堆栈,然而 - >是 - >良好() 称为该函数之外当in_stream不再存在时。

+1

你能发布实际的代码吗? – shuttle87 2010-09-29 17:08:14

+2

你在等同于打电话给医生,告诉他你受伤了,但不是在哪里,如何,或者为什么你认为你可能会受伤。代码在哪里? – identity 2010-09-29 17:08:58

+0

istream是一个指针吗? – 2010-09-29 17:10:22

这可能表示您的is成员不指向stringstream。当封闭对象被实例化时,它可能仅仅被初始化为一些垃圾值。

如果您正在测试指针为零,请确保它在构造函数中设置为零(如果您已经分离流,则将其重置为零)。

+0

+1指出缺乏初始化 - 这是最有可能的原因。 – 2010-09-29 17:24:20

你的程序中有其他地方有未定义的行为 - 我的猜测是你实际上将该指针转换为std::istream,即使它不是。我们需要看到in在能够正确运行的情况下被实例化。在代码库中查找任何代码到istream,我敢打赌你会发现问题。

您已经在最后两行中回答了问题。你有一个指向一个超出范围的对象的悬挂指针,使用它会导致未定义的行为(这很可能是崩溃)。只要需要,您需要确保物体存在,方法是将其放置在较长的范围内,或者使用new进行分配,并确保在不再需要时将其删除。

+2

如果使用'new'分配,它应该进入某种形式的智能指针,无论是'std :: auto_ptr',还是某种形式的范围或共享指针。 – 2010-09-29 17:30:40

+1

或者只是通过'.str()'中的值返回一个字符串,因为所有的OP都使用指针(试图)从中获取数据。 – Potatoswatter 2010-09-29 17:36:28