为什么在通过引用传递对象时不断出现分段错误



我正在尝试从文件中获取数据并将其存储在我创建的对象中。我一直遇到分段错误,但我不确定是什么原因造成的。这是代码:

Object<string> populateObj(Object<string>&,string);
string clean(string);
int main(){
  string dictionaryFile;
  ifstream inFile;
  ofstream outFile;
  Object<string> obj1;
  cout << "Enter the name of the Dictionary file" << endl;
  cin >> dictionaryFile;
  obj1 = populateObj(obj1,dictionaryFile);
}
Object<string> populateObj(Object<string> &obj,string fileName){
  ifstream file;
  string words = "";
  file.open(fileName);
  if(file.is_open()){
    while(!file.eof()){
      file >> words;
      obj.add(words);
    }
  }
  else
    cout << "could not open file..." << endl;
  return obj;
}

这可能会导致也可能不会导致您的问题,但这是错误的:

if(file.is_open()){
    while(!file.eof()){
        file >> words;
        obj.add(words);
    }
}

请尝试:

while (file >> words) {
  obj.add(words);
}

您的原始代码测试 EOF 太早而没有用处。

int main(){
  //...
  Object<string> obj1;
  //...
  obj1 = populateObj(obj1,dictionaryFile);
}
Object<string> populateObj(Object<string> &obj,string fileName){
  //...
      obj.add(words);
  //...
  return obj;
}

您不必要地覆盖了对象。别这样。虽然从技术上讲它可以工作,但这是一个坏习惯(它指出你的复制操作员有一个错误)。

相反,返回一个引用(如果有的话)并且不要覆盖该对象。另外,不要按值传入字典字符串,而是通过常量引用传递它:

int main(){
  //...
  Object<string> obj1;
  //...
  populateObj(obj1,dictionaryFile);
}
Object<string>& populateObj(Object<string> &obj,const string& fileName){
  //...
      obj.add(words);
  //...
  return obj;
}

我希望问题出在您的 Object 类中。如果您保留现有代码,并像这样定义对象,那么它将运行而不会出错:

template<class T> class Object {
public:
    void add(T);
};
template <class T> void Object<T>::add(T val)
{
    cout << "Adding " << val << "n";
}

因此,您需要查看 Object 类以了解它失败的原因。 最有可能的位置是复制对象以返回它,然后复制回原始 obj1。 该类是分配内存,还是使用不可复制构造的成员变量?

如果您删除不必要的对象返回,则可以通过避免复制来"修复"问题,但您可能仍然希望无论如何修复对象,否则当对象被复制时,此问题可能只会在其他地方出现。

相关内容

  • 没有找到相关文章

最新更新