背景:我正在编写一些代码来从文件中读取数据。数据示例由换行符分隔。此外,数据还有一个元级别,分号用作分隔符以指示已到达序列的末尾。该文件包含许多序列。我想打开文件,读入一行数据并将其存储为向量,对数据做一些事情,然后读入下一行......直到文件结束。
以下编译正常,当在我的 linux 机器上使用 valgrind 运行时,没有发现内存泄漏。但是,当我在实验室的 Windows 机器上使用 Parallel Studio 中的 c++ 检查器工具时,它会在我的程序中报告与内存相关的错误,这两个错误都在这个文件中。
报告了内存泄漏,似乎源于以下行:
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