如果有人能够对以下内容有所了解,我将非常感激:
我有一个Image类。我想为所述类的3个对象动态分配一些内存。我的方法是 -
Image **st0 = new Image*[3];
for (char j = 0; j<= 2; j++)
{
*st0[j].doSomething();
}
我的想法是(* st0)返回指向图像指针的指针,然后在末尾附加的[]将选择每个连续的图像。但是我得到一个关于访问未初始化内存的错误。 (访问冲突读取位置0xcdcdcdd1)
当我使用调试器逐步执行此操作时,我看到st0被分配给内存中的某个位置,但是当我进入实体内部时,它包含0xcdcdcdcd。什么是有效的?
答案 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.