在类构造函数中动态分配内存

时间:2014-09-13 08:56:38

标签: c++ visual-c++ dynamic-memory-allocation

我正在尝试用C ++实现一个用于存储优化问题数据的类。数据保存在文本文件中,格式为

  • n #number of rows
  • m #number of columns
  • c_ij #matrix of cost coefficient

因此,在我阅读文件之前,我不知道问题的大小,因此我需要动态分配内存。到目前为止我所做的是公开声明一个指针

int** C;
头文件中的

。然后在.cpp文件的构造函数中我做

ifstream InFile( fname );
InFile >> n;
InFile >> m;
int** C = (int**) calloc(n, sizeof(int *));
for(int i=0; i<n; ++i){
  C[i] == (int*) calloc(m,sizeof(int));
  for(int j=0, j<m; ++j){
    InFile >> C[i][j];
  }
}

其中fname是作为构造函数的参数给出的数据文件。当我在一个成员函数中,调用它ProcessData()尝试访问指向整数数组的指针的指针时,会出现问题。它似乎改变了地址!当我做的时候

cout << C;

在构造函数中我得到了

0000000000359300

然而,当我在成员函数中做同样的事情时,我得到了

000000013F57710C100

有谁能告诉我这里做错了什么? 我在64位Windows 7计算机上使用Visual Studio中的Visual C ++。

3 个答案:

答案 0 :(得分:2)

这一行

int** C = (int**) calloc(n, sizeof(int *));

声明一个新的(本地)变量并初始化它。要设置成员变量的值,只需删除声明位:

C = (int**) calloc(n, sizeof(int *));

答案 1 :(得分:0)

首先,不要在C ++中管理自己的内存。你可以简单地使用std::vector<std::vector<int>>为你管理它,这实际上有可能是正确的。

其次,在构造函数中,C是局部变量,因此它不可能与同时存在的任何其他变量具有相同的地址。

答案 2 :(得分:0)

最简单的方法是让你的班级有一个成员向量。向量包含一个指针并为其动态分配内存的过程,当您复制,移动或销毁对象时,它们的行为正常:

class MyClass
{
public:
    std::vector< std::vector<int> > C;

    MyClass(size_t rows, size_t cols):
        C( rows, std::vector<int>(cols, 0) )
    { }
};

在构造函数中进行用户输入可能是一个坏主意;而是做输入(并检查成功),然后构造对象:

size_t rows, cols;
if ( !(inFile >> rows >> cols) )
    throw std::runtime_error("input error");

MyClass obj(rows, cols);