【问题标题】:Suppress warning:deleting 'void*' is undefined抑制警告:删除 'void*' 未定义
【发布时间】:2015-04-28 06:00:34
【问题描述】:

我知道这个警告是什么,需要取消这个警告。是否有任何方法可以使用编译指示或编译器选项来抑制此警告?

【问题讨论】:

  • 这听起来像是你真的不应该压制的那种警告。你为什么要删除void *
  • 这通常是由于所有权处理不当造成的。分配内存的人应该是删除它的人。由于您在分配内存时知道类型,因此在删除内存时应该知道它。你为什么在 C++ 中使用 void *。
  • 你不应该在任何地方都有“void * p = new void”,那么你为什么要删除一个void指针呢?不要再搞乱类型系统了。你可能使用了太多的指针
  • 假设您有一个方法,该方法根据条件通过 new 分配 10 种或更多不同对象类型之一,然后将该新对象存储在 void* 类型的变量中。使用完成后,调用另一个方法删除对象。您只是删除 void* 中的内存,还是进行类似的分配类型检查并实施 10 多个不同的删除调用?如果前者有效并且可以消除警告,则这是一个更清洁的解决方案。

标签: c++11 suppress-warnings gcc-warning


【解决方案1】:

最好更改代码以避免此警告而不是抑制它! 如果处理不当,可能会导致运行时出现意外,这将很难找到。

[注意:要回答您的问题,应该谨慎对待,您可以使用free() 而不是delete,因为它会在释放之前将任何指针转换为void*。确保在它之前正确调用了析构函数。]

【讨论】:

    【解决方案2】:

    只需在删除之前强制转换即可。

    delete[] (char*)item_to_del;
    

    【讨论】:

    • 你是怎么猜到正确的类型是char
    • 这不是正确类型的问题,而是如何抑制编译器警告的问题。没有“正确的类型”。
    • 当然有一种正确的类型——已经被newed 的类型,或者适合解除分配的多态类型。您正在用一个 UB 换另一个。
    猜你喜欢
    • 2018-04-28
    • 2015-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-13
    • 2011-03-31
    • 2019-10-22
    相关资源
    最近更新 更多