【问题标题】:Dynamic array heap corruption动态数组堆损坏
【发布时间】:2012-04-07 16:50:23
【问题描述】:

我有以下课程:

template <typename T>
class matrix
{
private:
    int _n;
    T* array;
public:
    matrix(): _n(0) 
    {
        array = new T[_n * _n];
    }
    matrix(int n): _n(n)
    {
        if( n < 0 )
            throw "Invalid array size!";
        array = new T[_n * _n];
    }
    ~matrix()
    {
        delete[] array;
    }
    void Set(const int x, const int y,const T val)
    {
        if( ( x<0 || x>_n ) && ( y<0 || y>_n) )
            throw "Invalid index";
        array[x*_n + y] = val;
    }
    T& Get(const int x, const int y)
    {
        if( ( x<0 || x>_n ) && ( y<0 || y>_n) )
            throw "Invalid index";
        return array[x*_n + y];
    }
};

并以这种方式使用它:

matrix<int> k(5);
k.Set(5,5,6);
cout<<k.Get(5,5);

问题是调用 Set 时出现堆损坏错误。 我究竟做错了什么? (我猜这是我访问它们数组元素的方式)

【问题讨论】:

  • 还请注意,您的默认构造函数调用大小为 0 的数组 new。该调用返回的指针实际上是无用的,因为取消引用它是未定义的行为。

标签: c++ dynamic corruption heap-corruption


【解决方案1】:

可以在索引 0-4 处访问一个 5 元素数组。您为 xy 传递了 5,这会在访问 array 时导致索引无效。

【讨论】:

  • 该死,我完全错过了!谢谢!
  • @user1233963 - 如果您出于某种原因希望保留该方法(基于 1),您可以在计算解析数组元素的最终索引之前简单地减少 x 和 y .我建议从零开始,习惯它并喜欢它。
【解决方案2】:

C++ 中的数组是 0-base,这意味着如果你有一个数组 int x[5]x[5] 是无效的。

你的条件应该是if( ( x&lt;0 || x&gt;=_n ) &amp;&amp; ( y&lt;0 || y&gt;=_n) )if( ( x&lt;0 || x&gt;=_n ) &amp;&amp; ( y&lt;0 || y&gt;=_n) )

要设置最后一个元素,您需要

k.Set(4,4,6);

并打印出来:

cout<<k.Get(4,4);

【讨论】:

    【解决方案3】:

    什么是你必须从 0 开始计数。如果你创建一个大小为 n*n 的数组,你可以访问元素到 (n-1)*(n-1)。您的示例创建了一个大小为 5*5=25 的数组并尝试访问元素 25。但是 24 是您数组包含的最高元素。

    【讨论】:

      【解决方案4】:

      您正在将数组以外的内容索引到内存中,这就是您收到错误的原因。

      问题在于索引。 C++ 中数组的索引从 0 开始,因此对于您的 k(5) 声明,它会生成一个索引为 0-4 的 5 数组,因此索引 5 不是有效的有效索引。您应该将签入集更改为 x>=_n 和 y>=_n,因为 5 的索引无效。

      【讨论】:

        猜你喜欢
        • 2015-09-30
        • 2013-09-02
        • 1970-01-01
        • 1970-01-01
        • 2019-09-23
        • 2016-07-19
        • 1970-01-01
        • 1970-01-01
        • 2018-12-04
        相关资源
        最近更新 更多