C++ c++;;警告是什么;“默认启用”;在编译期间是什么意思?
我的代码编译没有错误,但这意味着什么C++ c++;;警告是什么;“默认启用”;在编译期间是什么意思?,c++,compiler-warnings,C++,Compiler Warnings,我的代码编译没有错误,但这意味着什么 etherate.cpp:432:11: warning: deleting array ‘unsigned char broadMAC [6]’ [enabled by default] 从这一行开始,我删除一个无符号字符数组 delete [] broadMAC; 保持现状可以吗?如果不行,我如何改进 谢谢 更新 broadMAC是如何申报的 从大约10行之前 unsigned char broadMAC[6] = {destMAC[0], des
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,并希望在之后将其删除。
broadMAC
在自动内存中分配,如下所示:
unsigned char broadMAC[6];
然后你打电话
delete[] broadMAC;
这是错误的,因为您没有为它分配new[]
在未分配new
/new[]
的内存上使用delete
/delete[]
会导致未定义的行为,在这种情况下,您的编译器非常聪明,可以判断
您不必担心释放内存,它会自动释放。您正在尝试释放在堆栈中分配的数组,而不是在堆中分配的数组。因此,当变量超出范围时,它将释放自身,您不应该/不能显式释放它。G++允许通过在命令行上指定来启用和禁用许多警告(例如,
-Wctor dtor privacy
,-Woverloaded virtual
,-W..
)。某些警告已启用,无需在命令行上执行此操作,其他警告必须显式请求
因此,有些警告是:
“默认情况下启用”
其中一些是:
“默认情况下禁用”
说得好,我要把这个加进去!现在很明显:参见Luchian的答案“默认启用”意味着编译器将生成此警告,即使您没有启用警告。这是因为在未分配
new[]
的内容上使用delete[]
始终是一个错误,因此您总是希望得到警告。broadMAC的声明与此问题无关,@Zdeslav。(此外,警告已经告诉我们它的声明是什么。)“保持现状可以吗?如果不能,我如何改进?”--不,保持现状不可以。您可以通过不尝试从堆中删除存储在堆栈上的数组来改进它。:)(即,不要对堆栈/自动存储变量调用delete,只对使用new分配的内容调用delete)谢谢@Luchian Grigore,这是一些很棒的信息!我对“默认启用”消息感到更加困惑,但了解是什么导致我的编译器捕获并生成该消息以及如何缓解该消息仍然很重要,谢谢+1Hi@JosephH,请看我对Luchian Grigore的评论,这就是为什么我将Olaf Dietsche标记为正确的,但再次感谢您提供了一些好的知识!:)我不确定它是否会说“默认禁用”。相反,对于通常禁用的选项,编译器将打印控制相关诊断显示的选项的名称。如果您不想让编译器告诉您这一点,那么在编译时使用-fno diagnostics show选项
选项。描述“默认启用”是什么,但不指出代码调用未定义的行为可能有点过于字面化(答案如下):@雅克当我写下我的答案时,卢卡恩·格里戈尔已经为我的缺点提供了一个完美的答案。所以,复制他的作品是没有意义的。