*** glibc обнаружен *** free (): неверный указатель:

Я полностью озадачен относительно причины вышеупомянутой ошибки 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);
}

parser.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

Parser.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;
}
}

Поскольку я не вызываю явно операторы удаления, я понятия не имею, почему происходит ошибка.

2

Решение

Скорее всего, это пропущенное возвращение.

Тогда в вашем основном методе Settings локальный объект никогда не инициализируется. Затем его область действия заканчивается и вызывается деструктор для векторов в нем, и они думают, что у них есть указатель (потому что они инициализированы с мусором в памяти) и вызывают delete для своего указателя.

Добавление -Wall чтобы включить все предупреждения, скажу вам об этом в будущем.

6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]