在类中初始化动态内存数组

时间:2010-12-14 18:15:31

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

我是c ++编程的新手,这可能是一个微不足道的问题,但我需要在类中构造一个可变大小的数组并将文本文件数据传输到其中,如下所示。这里HISTORYFile >> ClusterCoord[i];似乎很好地接受了信息,但是当我尝试通过主程序访问信息时,

cout << CoordClassExample.ClusterCoord[1] << "\n";

我收到了一个总线错误。如果可以,请帮忙!

class CoordClass{
public:
    int Entries;
    double * ClusterCoord;
    void set_valuesCoord(ifstream &HISTORYFile,int MolAtomNum, int MolNum);
};

void CoordClass::set_valuesCoord(ifstream& HISTORYFile,int MolAtomNum, int MolNum) {
    Entries=MolAtomNum*MolNum;
    double *ClusterCoord = new double [Entries];

    for (int i=0;i<Entries;i++) {
        HISTORYFile.ignore(1000,'\n');      
            HISTORYFile >> ClusterCoord[i];
        cout << ClusterCoord[i] << "\n";
            HISTORYFile.ignore(1000,'\n');
    }
}

2 个答案:

答案 0 :(得分:1)

如果您调用该函数两次,则set_valuesCoord()函数中存在泄漏,除非您在某处释放资源。这不是 问题,但它是 问题。使用std::vector<>

class CoordClass {
    // ...
    std::vector<double> ClusterCoord;  // instead of double *ClusterCoord
    // ...
};

可能的问题是您没有检查double是否正确解析。如果没有,那么你正在访问未初始化的内存,这会导致未定义的行为。

void CoordClass::set_valuesCoord(...)
{
    // ...
    double cluster_coord = 0;
    if( HISTORYFile >> cluster_coord )
        ClusterCoord.push_back(cluster_coord);
    else
        std::cerr << "Error parsing cluster coord.\n";
    // ...
}

答案 1 :(得分:1)

作为一种练习,显示vector方式不会泄露其他内容:

进一步的更改是删除条目并使用ClusterCoord.size()

class CoordClass{
public:
    int Entries;
    std::vector<double> ClusterCoord;
    void set_valuesCoord(ifstream &HISTORYFile,int MolAtomNum, int MolNum);
};

void CoordClass::set_valuesCoord(ifstream& HISTORYFile,int MolAtomNum, int MolNum) {
    Entries=MolAtomNum*MolNum;
    ClusterCoord.resize(Entries);

    for (int i=0;i<Entries;i++) {
        HISTORYFile.ignore(1000,'\n');      
            HISTORYFile >> ClusterCoord[i];
        cout << ClusterCoord[i] << "\n";
            HISTORYFile.ignore(1000,'\n');
    }
}