2012-04-22 5 views
-1

При экспериментировании с C++ и функцией reinterpret_cast я попытался преобразовать short в string и получил исключение STATUS_ACCESS_VIOLATION.reinterpret_cast и STATUS_ACCESS_VIOLATION

short s = 32767; 

    short* s2 = &s; 
    string* test4 = reinterpret_cast<string*>(s2); 

    cout << "reinterpret_cast: " << *test4 << endl; 

В моем понимании, была попытка использовать часть памяти, которая не распределяется в процессе моего приложения.

Как я могу следить за такими попытками доступа к запрещенной памяти? Как я могу переосмыслить только этот кусок, который содержит мое короткое значение?

+0

использовать «static_cast», когда это возможно. – ApprenticeHacker

+2

Просто прекратите отливку –

ответ

1

Вы не преобразовывали short в string; вы берете адрес short, а затем пытаетесь получить доступ к памяти по этому адресу, как если бы он содержал string, чего нет.

К счастью, в вашем случае это привело к тому, что некоторые случайные фрагменты данных интерпретировались как недопустимый указатель, и поэтому вы получили ошибку нарушения доступа. Если там что-то было похоже на правильную строковую структуру, тогда могут возникнуть всевозможные странности.

Как я могу следить за такими попытками доступа к запрещенной памяти?

Не используйте reinterpret_cast для преобразования между указателями на несвязанные типы и ожидайте, что переопределенное значение укажет на действительный объект; и не используйте его вообще, если вы точно не знаете, что с ним делаете.

Как я могу переосмыслить только этот кусок, который содержит мое короткое значение?

Если вы хотите, чтобы преобразовать число в строку, то вы можете использовать строковый поток:

std::ostringstream stream; 
stream << s; 
std::cout << "formatted with a stringstream: " << stream.str() << std::endl; 

или, если вы используете C++ 11, то есть стандартные функции для преобразование чисел в строки:

std::string string = std::to_string(s); 
std::cout << "converted with to_string: " << string << std::endl; 
1

литье не преобразует автоматически один тип данных в другой. reinterpret_cast - особенно мощная и опасная операция, которая может использоваться только с глубоким знанием соответствующих типов данных. Я не буду вдаваться в подробности здесь, но длинный и короткий из них, указатель на короткий не может быть отличен с reinterpret_cast в указатель на строку.

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