使用向量的缓冲区溢出


unsigned short* myClass::get_last(size_t _last) const
{
if (_last == 0) _last = last.size();
if (_last <= last.size())
{
unsigned short* temp = new unsigned short [_last] {};
while (_last > 0) temp[_last] = last[last.size() - _last--]; //I get a warning HERE
return temp;
}
throw std::runtime_error("Error!");
}

它说:

写入"temp"时缓冲区溢出:可写大小为"_last*2" 字节,但可能会写入"_last"字节。

什么意思?我确定_last由于if不会大于temp.size((,那么我该怎么办?

它在运行时完美运行,但我讨厌有警告,这些警告会使其他用户或将来我更难理解我的代码。


编辑:_last是用户在运行时给出的参数,因此它最终可能具有任何值,但如果他的值超出范围,则会出现异常(在另一个函数中管理(。

我在标题中提到的向量是最后一个,whis 是myClass的成员。

我知道数组的元素从0到 _last- 1,这就是为什么我在第一次使用它之前递减_last(您可能知道赋值关联性是从右到左的(。


我希望我回答了您的所有评论;)

问题是C++索引以 0 开头的数组。因此,大小为 4 的数组具有有效的索引 0、1、2 和 3。

但是您正在分配一个大小_last数组:

unsigned short* temp = new unsigned short [_last] {};

然后写信给temp[_last].这超出了数组的大小。

使用向量求解!

std::vector<unsigned short> Tombola::get_last(size_t _last) const
{
if (_last == 0) _last = last.size();
if (_last <= last.size())
{
std::vector<unsigned short> temp(_last);
while (_last > 0) temp[_last] = last[last.size() - _last--];
return temp;
}
throw std::runtime_error("Error!");
}

出于某种原因,即使您不知道如何;),他们也总是解决所有问题

最新更新