【问题标题】:How do I prevent this buffer overrun?如何防止此缓冲区溢出?
【发布时间】:2019-11-08 11:15:06
【问题描述】:

我正在编写一个处理任意大小的多项式的类,当重载 * 运算符时,我有一个缓冲区溢出警告,我不知道如何处理。

Polynomial Polynomial::operator*(const Polynomial& rhs) 
{
    int returnSize = (this->size + rhs.getSize()) - 1;
    int* returnArray = new int[returnSize];

    for (int i = 0; i < this->size; i++) 
    {
        for (int j = 0; j < rhs.getSize(); j++)
        {
            returnArray[i + j] = this->polynomial[i] * rhs.polynomial[j];
        }
    }
}

而且我认为,由于程序的性质,实际上不可能出现缓冲区溢出,但我不太了解它,所以我可能弄错了。警告指出:

C6386:写入“returnArray”时缓冲区溢出:可写大小为“returnSize*4”字节,但可能写入“8”字节。

复制构造函数也有这个问题。

Polynomial::Polynomial(const Polynomial& rhs)
{
    this->size = rhs.getSize();
    this->polynomial = new int[rhs.getSize()];

    for (int i = 0; i < rhs.getSize(); i++)
    {
        this->polynomial[i] = rhs.polynomial[i];
    }
}

我真的希望这不是一个愚蠢的问题,感谢您的帮助!

【问题讨论】:

  • 表达式(this-&gt;size + rhs.getSize()) - 1;为什么要减1?而且我认为您的索引[i + j] 不正确。
  • 为了减少头痛,请考虑切换到std::vector&lt;int&gt;,而不是每次都新建自己的 int []。
  • 这是因为新多项式中的最高幂将等于相乘多项式中的两个最高幂相加。而且由于最高功率存储在数组的最后一个元素中(例如 X^3 存储在索引 3 中),所以我必须从新大小中减去 1,否则我会留下一个太大的数组。例如,两个立方(大小为 4)相乘需要一个大小为 7 的数组,其中 X^6 存储在第 6 个索引中。
  • 虽然我知道 std::vectors 肯定更容易,但我试图在不使用它们来更好地理解 C++ 的情况下实现这一目标。
  • 嗯。我会说专注于多项式,不要与 STL 对抗。使用向量,单独编写一个资源管理类来了解如何在 C++ 中做到这一点。两个不同的问题。

标签: c++


【解决方案1】:

警告是因为编译器在编译时不知道returnSize 的值,并假设它可能小于2。您可以通过为至少两个 int 在你的 new 调用中的值:

int* returnArray = new int[std::max(returnSize,2)]; // Need #include <algorithm> for std::max

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-12
    • 2013-02-10
    相关资源
    最近更新 更多