reinterpret_cast和STATUS_ACCESS_VIOLATION

时间:2012-04-22 12:59:17

标签: c++ exception reinterpret-cast explicit-conversion

在尝试使用C ++和reinterpret_cast函数时,我尝试将short转换为string并获得了STATUS_ACCESS_VIOLATION异常。

   short s = 32767;

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

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

根据我的理解,尝试使用一段内存,但没有分配给我的应用程序。

我如何看待禁止内存访问的尝试?我怎样才能重新解释这个包含我的短值的作品?

2 个答案:

答案 0 :(得分:1)

您未将short转换为string;您正在获取short的地址,然后尝试访问该地址的内存,就像它包含string一样,而不是reinterpret_cast

幸运的是,在您的情况下,这导致一些随机数据被解释为无效指针,因此您遇到了访问冲突错误。如果碰巧有些东西看起来像一个有效的字符串结构,那么可能会发生各种各样的怪异。

  

我如何看待禁止内存访问的尝试?

不要使用std::ostringstream stream; stream << s; std::cout << "formatted with a stringstream: " << stream.str() << std::endl; 在指向不相关类型的指针之间进行转换,并期望重新解释的值指向有效对象;并且根本不要使用它,除非你确切知道你正在做什么。

  

如何才能重新解释这件包含我的短值的作品?

如果要将数字转换为字符串,则可以使用字符串流:

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

或者,如果您使用的是C ++ 11,那么有一些标准函数可以将数字转换为字符串:

{{1}}

答案 1 :(得分:1)

转换不会自动将一种数据类型转换为另一种数据类型。 reinterpret_cast是一项特别强大且危险的操作,只能在对相关数据类型有深入了解的情况下使用。我不打算详细介绍这里的细节,但是它的长短不一,指向short的指针不能用reinterpret_cast转换成指向字符串的指针。

如果需要将short值转换为字符串,请查看stringstream类,其他类可以使用各种输入(包括short)并将它们转换为字符串。