Ошибка нарушения прав доступа с ioStream

Я создаю ioStream, а затем использую оператор, перегруженный в dll:

  std::istrstream wStream((char *)aString,strlen(aString));
  wStream >> wValue;

aString — это константа char*, полученная в качестве параметра. Вторая строка вызывает эту ошибку времени выполнения:

0xC0000005: Местоположение чтения нарушения доступа 0x00000020

Однако, когда я заменяю вторую строку фактическим кодом функции перегрузки оператора, я не получаю никакой ошибки.

Обратите внимание, что я создаю это в Visual Studio 2010, и тот же код выполняется без ошибок при компиляции в Visual Studio 2005.


person julienln    schedule 14.02.2011    source источник
comment
Вы можете остановиться на этом? Что такое aString в этом примере? Что такое wValue? Вы почти наверняка сталкивались здесь с неопределённым поведением, но без дополнительной информации сложно помочь.   -  person Flexo    schedule 14.02.2011
comment
также strstream устарел, именно из-за опасностей, связанных со строками стиля c, и приведение стиля c может маскировать другие проблемы, которые могут вызвать у вас проблемы и здесь.   -  person Flexo    schedule 14.02.2011
comment
Я пытался использовать istrstream вместо istrstream, но все равно получаю ту же ошибку. Кроме того, aString — это const char *, а wValue — объект, который перегружает оператор ››.   -  person julienln    schedule 14.02.2011
comment
Что такое тип aString и как он инициализируется.   -  person Martin York    schedule 14.02.2011


Ответы (1)


Трудно сказать без контекста о том, как устанавливается aString, но istrstream является устаревшим классом. Думали ли вы о том, чтобы попробовать istringstream вместо этого в качестве теста, чтобы сузить круг вопросов?

std::istringstream wStream(std::string(aString));
wStream >> wValue;

РЕДАКТИРОВАТЬ: при дальнейшем рассмотрении это выглядит подозрительно, как будто ваш aString на самом деле имеет значение null, и когда strstream пытается его прочитать, в конечном итоге он умирает из-за нарушения доступа. Попробуйте распечатать необработанное значение указателя aString перед выполнением операций с потоком строк (что-то вроде std::cout << static_cast<void*>(aString) << std::endl;)

person Mark B    schedule 14.02.2011