为什么在C++中void*被认为是不安全的?

4
我正在阅读Bjarne Stroustrup的C++ FAQ网站。 我看到了以下内容。
  • 避免使用void*(如果你确实需要它们,请将它们保留在低级函数和数据结构内,并向用户提供类型安全接口,通常是模板)
为什么void*在C ++中被认为是不安全的?

4
为了使用 void*,你需要在某个时候将其转换回最初指向的任何类型。如果你转换错误,会导致未定义的行为。换句话说,void* 放弃了 类型安全 - john
3
你了解类型安全的概念吗? - Christian Hackl
@ChristianHackl 是的,我知道。C++是一种严格类型转换的语言。那么问题是什么? - msc
2
@rsp "严格类型转换语言" 意思是什么?那么 void* 的问题不应该很明显吗? - πάντα ῥεῖ
@πάνταῥεῖ 请查看此链接:https://wandbox.org/permlink/DikGnmRJmdUBVlae - msc
@rsp 当然,还有什么?使其“不安全”的是需要进行类型转换。如果使用错误的类型转换(例如到double*),你就会迷失方向。在更复杂的场景中,程序员可能很难选择正确的类型转换。 - πάντα ῥεῖ
2个回答

4
为什么在C++中void*被认为是不安全的?
因为void*表示一个没有任何类型信息的内存地址。编译器无法知道该地址上使用了什么数据类型结构和原始内存包含什么信息。
在这种情况下,程序员需要自己正确地解密内存布局,这是一个容易出错的过程,程序员需要确切地知道他们在那里做什么。
因此,正如你引用的那样(强调我的):
避免使用void*(如果您真的需要它们,请将它们保留在低级函数和数据结构中,并向用户提供类型安全的接口,通常是模板)。
这与使用void*丢失类型安全有关。
另外,关于上面的引用:
在C ++中,首选使用模板,因为原始类型信息永远不会丢失,而使用void*作为参数的“通用”c风格函数则会丢失原始类型信息。

0
在C语言中提供“通用”函数或数据结构的标准方法是使用void*作为数据类型,以便将任何分配的内存放入其中。这样做的不幸之处是允许将不同类型的数据放入同一个容器中。在C++中,通过提供“模板”来解决这个问题,模板可以在编译时创建类型安全的函数和类/结构体实例,从而确保类型正确性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接