2010-12-14 67 views
0

我是新来的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'); 
    } 
} 
+1

如果你是新的C++,请[收拾好C++的书(http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)并通读它。你应该使用'std :: vector '而不是原始数组;我已经可以在'set_valuesCoord()'函数中看到内存泄漏。 – 2010-12-14 18:17:29

+0

你的代码有很多错误。请参考书籍链接@In silico给你。 – 2010-12-14 18:19:14

+0

是的,也许我应该试着重新编写一个我在飞行中用fortran编写的程序。即使你可以给我什么搜索,这将是有益的。也许突出内存泄漏线。 – 2010-12-14 18:24:03

回答

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"; 
    // ... 
} 
+0

感谢您的提示。双重definately做了解析正确,我已经运行这只是预先固定数组的大小。 – 2010-12-14 18:39:43

+0

在函数中分配动态数组大小有什么根本性的错误吗? – 2010-12-14 18:41:44

+0

好吧,我是一个dum dum,对不起因为浪费你的时间才意识到它应该是:ClusterCoord = new double [Entries]; – 2010-12-14 18:43:59

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'); 
    } 
} 
+0

这是比以前更好的答案,因为它预先调整了向量的大小(+1)。所以,避免了前面例子中对内存分配和复制的惩罚。除了内存泄漏之外,如果在类的析构函数中没有删除ClusterCoord,我不会看到总线错误的原因。令人惊讶的是我没有看到这个答复。任何接受者。谢谢 – cppcoder 2011-09-05 23:31:54