Почему вызов std :: stringstream's good () через указатель приводит к сбоям? - PullRequest
1 голос
/ 29 сентября 2010

У меня проблемы с объектом stringstream. Мой класс имеет входной поток в качестве члена. Я проверяю, есть ли obj-> istream, а после этого - если obj-> istream-> 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 выходит из области видимости, он принадлежит локальному стеку, однако -> is-> good () вызывается вне этой функции, когда in_stream больше не существует.

Ответы [ 3 ]

4 голосов
/ 29 сентября 2010

Вы ответили на вопрос в последних двух строках. У вас есть свисающий указатель на объект, который вышел из области видимости, и его использование приведет к неопределенному поведению (что вполне может быть крахом). Вы должны убедиться, что объект существует столько, сколько ему нужно, поместив его в более длительную область или выделив его с помощью new и убедившись, что он удален, когда он больше не нужен.

3 голосов
/ 29 сентября 2010

Это, вероятно, означает, что ваш участник is не указывает на stringstream. Он может быть просто инициализирован до некоторого значения мусора при создании экземпляра окружающего объекта.

Если вы проверяете, что указатель равен нулю, убедитесь, что он установлен на ноль в конструкторе (и сбросьте на ноль, если вы когда-либо отсоедините поток).

1 голос
/ 29 сентября 2010

У вас есть неопределенное поведение где-то еще в вашей программе - я предполагаю, что вы фактически преобразовали этот указатель в std::istream, хотя это не так.Нам нужно увидеть, где создается экземпляр in, прежде чем мы сможем точно определить, что происходит.Ищите любые приведения к istream в вашей кодовой базе, и я уверен, что вы найдете проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...