使用向量的缓冲区溢出
Buffer Overrun using a Vector
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!");
}
它说:
Buffer overrun while writing to 'temp': the writable size is '_last*2'
bytes, but '_last' bytes might be written.
这是什么意思?我确定 _last 不大于 temp.size() 因为 if
所以我该怎么办?
它在运行时完美运行,但我讨厌收到警告,因为警告会让其他用户或我以后难以理解我的代码。
编辑:
_last 是用户在运行时给出的参数,所以它最终可能有任何值,但如果他的值超出范围,你会得到一个异常(在另一个函数中管理)。
我在标题中提到的向量是 last,它是 myClass.
的成员
我知道数组的元素从 0 到 _last - 1,这就是为什么我递减 _last 在第一次使用它之前(你可能知道赋值关联性是 right-to-left)。
我希望我回答了你所有的评论 ;)
问题是 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!");
}
出于某种原因,他们总能解决所有问题,即使您不知道如何解决;)
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!");
}
它说:
Buffer overrun while writing to 'temp': the writable size is '_last*2' bytes, but '_last' bytes might be written.
这是什么意思?我确定 _last 不大于 temp.size() 因为 if
所以我该怎么办?
它在运行时完美运行,但我讨厌收到警告,因为警告会让其他用户或我以后难以理解我的代码。
编辑: _last 是用户在运行时给出的参数,所以它最终可能有任何值,但如果他的值超出范围,你会得到一个异常(在另一个函数中管理)。
我在标题中提到的向量是 last,它是 myClass.
的成员我知道数组的元素从 0 到 _last - 1,这就是为什么我递减 _last 在第一次使用它之前(你可能知道赋值关联性是 right-to-left)。
我希望我回答了你所有的评论 ;)
问题是 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!");
}
出于某种原因,他们总能解决所有问题,即使您不知道如何解决;)