Справочная информация: я работаю над кодом для чтения данных из файла. Примеры данных разделены новыми строками. Кроме того, существует метауровень к данным, и точка с запятой действует как разделитель, чтобы указать, что конец последовательности достигнут. Файл содержит много последовательностей. Я хотел бы открыть файл, прочитать строку данных и сохранить ее как вектор, сделать что-то с данными, затем прочитать в следующей строке ... до конца файла.
Следующие компилируются нормально, и при запуске с valgrind на моем Linux-компьютере утечки памяти не обнаруживаются. Однако, когда я использую инструмент инспектора c ++ в Parallel Studio на компьютере моей лаборатории с Windows, он сообщает об ошибках, связанных с памятью, в моей программе, оба в этом файле.
Сообщается об утечке памяти, которая, кажется, происходит из строки:
ss>>number;
А также утечка ресурсов ядра сообщается со следующим:
data.open(filename.c_str());
Может кто-нибудь помочь мне понять, почему я получаю эти ошибки и что я должен сделать, чтобы исправить их? Я не понимаю, почему это утечка памяти, и еще менее уверен в ошибке ресурса ядра. Кроме того, если я делаю что-то невероятно глупое, не стесняйтесь, дайте мне знать!
class Network;
namespace data {
static std::string trainfiles[] = {
"/home/samurain/htm_check/data_files/train/sequence1.train",
"/home/samurain/htm_check/data_files/train/sequence2.train"};
static std::string testfiles[] = {
"/home/samurain/htm_check/data_files/train/sequence1.train",
"/home/samurain/htm_check/data_files/train/sequence2.train"};
}
const char SEQ_DELIM = ';';
struct Example
{
std::vector<int> stimulus;
std::fstream data;
bool clear() {stimulus.clear();}
bool open_file(std::string & filename)
{
data.open(filename.c_str());
if (!data)
{
std::cout <<"error opening file\n";
return false;
}
std::cout<<"opening file... " <<filename <<" opened \n";
return true;
}
bool close_file()
{
std::cout<<"closing file... ";
data.close(); data.clear();
std::cout<<"closed\n";
return true;
}
bool read_next(Network * myNetwork, bool & new_seq)
{
if (!data)
{
std::cout<<"file not opened" <<std::endl;
return false;
}
if (data.peek() == SEQ_DELIM)
{
data.ignore(100,'\n');
myNetwork->clearStates();
new_seq = true;
}
int number = 300; //assuming input will be integer values, not set to 0 for debugging purposes
std::string line;
getline(data, line);
if (!data.good())
{
std::cout<<"end of file reached" <<std::endl;
return false;
}
std::stringstream ss(line);
while (ss)
{
ss>>number;
if (ss.good())
{
stimulus.push_back(number);
}
}
return true;
}//end read next
};//end of Example