使用了求助者的代码作为例子,编译器提示C6386警告
#include<iostream>
using namespace std;
unsigned int nNumItems = 0;
int main()
{
int* nWords = nullptr;
unsigned int nTotal;
nTotal = 3 + 2 * nNumItems;
nWords = new int[nTotal];
nWords[0] = 1;
nWords[1] = 2; // this is line 18, warning C6386
delete[] nWords;
return 0;
}
警告具体内容如下:
提示在堆区开辟空间时,缓冲区溢出。
写入到"nWord"时缓冲区溢出:可写大小为"nTotal*4"个字节,但可能写入了"8"个字节。
在官方文档中,该警告常见于存储的数据个数超过数组上限,产生溢出。但这显然与此代码中产生的问题不符,经过多次修改尝试和运行,我认为该警告源于单纯的代码审查错误,无法判断nTatal的内容和大小。
可以修改产生警告的代码顺序,将nTotal的定义置于堆区开辟之后,解决方案如下:
nWords = new int[3 + 2 * nNumItems];
nTotal = 3 + 2 * nNumItems;
修改后,不再提示该警告。