【问题标题】:reinterpret_cast and STATUS_ACCESS_VIOLATIONreinterpret_cast 和 STATUS_ACCESS_VIOLATION
【发布时间】:2012-04-22 12:59:17
【问题描述】:

在尝试使用 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;

据我了解,有人尝试使用一块内存,该内存未分配给我的应用程序进程。

我怎样才能发现这种被禁止的内存访问的尝试?我怎样才能只重新解释这件作品,它包含我的短值?

【问题讨论】:

  • 尽可能使用static_cast

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


【解决方案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;

【讨论】:

    【解决方案2】:

    强制转换不会自动将一种数据类型转换为另一种数据类型。 reinterpret_cast 是一种特别强大且危险的操作,只有在熟悉相关数据类型的情况下才能使用。这里就不赘述了,总而言之,指向short的指针不能用reinterpret_cast转换成指向字符串的指针。

    如果您需要将短值转换为字符串,请查看stringstream 类,它与其他流一样可以消耗各种输入(包括短值)并将它们转换为字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多