用于创建对象数组的双指针(访问冲突读取位置0xcdcdcdd1)

时间:2014-04-13 01:47:05

标签: c++ pointers

如果有人能够对以下内容有所了解,我将非常感激:

我有一个Image类。我想为所述类的3个对象动态分配一些内存。我的方法是 -

    Image **st0 = new Image*[3];

    for (char j = 0; j<= 2; j++)
    {
         *st0[j].doSomething();
    }

我的想法是(* st0)返回指向图像指针的指针,然后在末尾附加的[]将选择每个连续的图像。但是我得到一个关于访问未初始化内存的错误。 (访问冲突读取位置0xcdcdcdd1)

当我使用调试器逐步执行此操作时,我看到st0被分配给内存中的某个位置,但是当我进入实体内部时,它包含0xcdcdcdcd。什么是有效的?

enter image description here

2 个答案:

答案 0 :(得分:2)

Image **st0 = new Image*[3];

这会分配空间来存储指向类Image的对象的三个指针。它不为这些对象分配内存。有两个选项可以解决这个问题:

1)改为分配一组对象:

Image *st0 = new Image[3];

2)分配对象:

Image **st0 = new Image*[3];
for(i = 0; i < 3; i++)
{
    st0[i] = new Image;
}

第一个选项更简单,第二个选项允许您根据需要分配和取消分配Image。哪一个更好取决于你的其他程序。

答案 1 :(得分:0)

除非您纯粹使用受虐狂(或该命令中的某些内容)使用动态分配,否则最好避免使用它。

我宁愿使用一个使用std::vector存储数据的小类,并提供操作符重载来支持对该数据的2D寻址:

template <typename T>
class Matrix {
    std::vector<T> data;
    size_t cols;
public:
    Matrix(size_t X, size_t Y) : cols(x), data(x*y) {}
    T &operator()(size_t x, size_t Y) {
        return data[Y*cols+x];
    }
};

然后只需要实例化你想要的矩阵大小并使用你的数据:

Matrix<Image> st0(3, 3);

st0(0, 0) = whatever;
st1(1, 1) = something_else;
// etc.