【问题标题】:c++; What does the warning "enabled by default" mean during compile?C++;编译期间“默认启用”的警告是什么意思?
【发布时间】:2012-10-29 21:45:22
【问题描述】:

我的代码编译没有错误,但这意味着什么?

 etherate.cpp:432:11: warning: deleting array ‘unsigned char broadMAC [6]’ [enabled by default]

从这一行开始,我正在删除一个无符号字符数组;

delete [] broadMAC;

可以保持原样吗?如果不能,我该如何改进?

谢谢。

更新

broadMAC 是如何声明的?

从前面大约 10 行开始;

unsigned char broadMAC[6] = {destMAC[0], destMAC[1], destMAC[2], destMAC[3], destMAC[4], destMAC[5]};

destMAC 也是一个无符号字符数组,其中存储有值。 我需要将它们复制出来,用 destMAC 做一些事情,然后恢复原始值;所以我已经声明了broadMAC并希望在之后删除它。

【问题讨论】:

  • 好点,我会添加这个!
  • 好吧,现在很明显:请参阅 Luchian 的回答
  • “默认启用”表示即使您没有启用警告,编译器也会生成此警告。那是因为在没有分配 new[] 的东西上使用 delete[] 总是一个错误,所以你总是希望得到警告。
  • broadMAC 的声明与这个问题无关,@Zdeslav。 (此外,警告已经告诉我们它的声明是什么。)
  • “可以保持原样吗?如果不行,我该如何改进?” ——不,不能保持原样。您可以通过不尝试从堆中删除存储在堆栈上的数组来改进它。 :) (即,不要在堆栈/自动存储变量上调用 delete —— 只在你用 new 分配的东西上调用 delete)

标签: c++ compiler-warnings


【解决方案1】:

broadMAC 分配在自动内存中,如下所示:

unsigned char broadMAC[6];

然后你打电话

delete[] broadMAC;

这是错误的,因为您没有使用new[] 分配它。

在未使用new/new[] 分配的内存上使用delete/delete[] 会导致未定义的行为,而您的编译器足够聪明,可以在这种情况下进行判断。

你不必担心释放内存,它会自动释放。

【讨论】:

  • 感谢@Luchian Grigore,这是一些很棒的信息!我真的对“默认启用”消息感到更加困惑,但是了解导致我的编译器捕获和生成消息的原因以及如何缓解它仍然很重要,所以谢谢! +1
【解决方案2】:

G++ 允许通过在命令行上指定它们来启用和禁用许多警告(例如-Wctor-dtor-privacy-Woverloaded-virtual-W...)。有些警告是启用的,不需要在命令行上这样做,其他的必须明确请求。

所以,一些警告是:

“默认启用”

有些是:

“默认禁用”

【讨论】:

  • 我不确定它是否说过“默认禁用”。相反,对于通常禁用的选项,编译器将打印控制相关诊断显示的选项名称。如果您不想让编译器告诉您这一点,请在编译时使用-fno-diagnostics-show-option 选项。
  • 描述什么是“默认启用”而不指出代码调用未定义的行为可能有点过于字面意思。 :)
  • @Yakk 当我写下我的答案时,Luchian Grigore 已经为这些缺点提供了一个完美的答案。所以,复制他的作品是没有意义的。
【解决方案3】:

您正在尝试释放您在堆栈中分配的数组,而不是堆。因此,当变量超出范围时,它将自行释放,您不应该/不能显式释放它。

【讨论】:

  • 嗨@JosephH,请参阅我对 Luchian Grigore 的评论,这就是我将 Olaf Dietsche 标记为正确的原因,但再次感谢您提供的一些知识! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-18
  • 1970-01-01
  • 1970-01-01
  • 2012-02-04
  • 1970-01-01
  • 2013-06-25
相关资源
最近更新 更多