为什么在C ++中将void *视为不安全?

时间:2018-09-01 07:32:13

标签: c++ c++11 void-pointers

我正在阅读Bjarne Stroustrup C ++常见问题解答站点。我在哪里看到以下行。

  
      
  • 避免使用void*(将其保留在低级函数和数据结构中)   如果您确实需要它们并提供类型安全的接口,通常   模板,提供给您的用户)
  •   

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

2 个答案:

答案 0 :(得分:4)

  

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

因为void*代表没有任何类型信息的内存地址。编译器无法知道该地址上的原始内存所使用的数据类型结构。

在那种情况下,程序员负责正确地自己对内存布局进行解密,这是一个容易出错的过程,程序员需要确切地知道他们在做什么。

从某种意义上说,你一直在引用(强调我的意思)

  
    
        
  • 避免使用void*(如果确实需要它们,请将它们保留在低级函数和数据结构中,并向您提供 类型安全的 接口,通常是模板)用户)
  •     
  

这与void*失去类型安全性有关。


总结以上引用:

首选使用c ++模板,因为原始类型信息不会像使用void*作为参数的泛型 c样式函数那样丢失。

答案 1 :(得分:0)

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