2

上記のglibcエラーの原因について、私は完全に困惑しています。明らかな何かが欠けているに違いありませんが、次のプログラム (4 つのファイルで構成される) が終了するたびに表示されます。

TankSim.h:

#ifndef TANKSIM_WDECAY_TANKSIM_H_
#define TANKSIM_WDECAY_TANKSIM_H_

#include <cstdlib>
#include <iostream>

#include "Parser.h"

int main();

#endif

TankSim.cpp:

#include "TankSim.h"

using std::cout;
using std::endl;

int main()
{
     const Settings gGlobals = ParseConfig();

     return(0);
}

パーサー.h:

#ifndef TANKSIM_WDECAY_PARSER_H_
#define TANKSIM_WDECAY_PARSER_H_

#include <cstdlib>
#include <vector>
#include <fstream>
#include <sstream>
#include <iostream>

struct Settings {
  double speedlight;
  double refractiveindex;
  double absorptionchance;
  double pmtradius;
  double photspermetre;
  double tankradius;
  double tankheight;
  long unsigned int randomseed;
  double scatterangle;
  std::vector<double> entrypoint;
  std::vector<double> entrydrn;
};

Settings ParseConfig();

#endif

パーサー.cpp:

#include "Parser.h"

using std::string;
using std::vector;
using std::cout;
using std::endl;

Settings ParseConfig()
{
  Settings settings;

  std::ifstream configfile("settings.dat");

  string line;
  while(getline(configfile,line)){
    //Comments start with %
    if(line.find("%") != string::npos){
      cout << "Comment: " << line << endl;
      continue;
    }

    //Read in variable name.
    std::stringstream ss;
    ss << line;
    string varname;
    ss >> varname;
    string value = line.substr(varname.length()+1);
    cout << varname << "-" << value << endl;
  }
}

削除演算子を明示的に呼び出していないため、エラーが発生する理由がわかりません。

4

1 に答える 1

6

ほとんどの場合、return ステートメントが欠落しています。

次に、メイン メソッドでSettingsローカル オブジェクトが初期化されることはありません。次に、そのスコープが終了し、その中のベクトルのデストラクタが呼び出され、ポインタがあると見なされ (メモリ内のジャンクで初期化されるため)、ポインタで delete が呼び出されます。

すべての警告を有効にするために追加-Wallすると、将来これについて通知されます。

于 2012-10-18T17:39:10.327 に答える