Visual studio 2008 这是内存泄漏吗?内核资源泄漏?(C+;+;,平行工作室)
背景:我正在编写一些代码来读取文件中的数据。数据示例用换行符分隔。此外,数据还有一个元级别,分号充当分隔符,表示序列已到达末尾。该文件包含许多序列。我想打开文件,读入一行数据并将其存储为向量,对数据做一些处理,然后读入下一行。。。直到文件结束 下面的编译很好,在我的linux机器上使用valgrind运行时,没有发现内存泄漏。但是,当我在实验室的Windows机器上使用并行监视器工具的C++监视器工具时,它会报告程序中与内存相关的错误,这两个文件都在。 据报告,内存泄漏似乎源于以下线路:Visual studio 2008 这是内存泄漏吗?内核资源泄漏?(C+;+;,平行工作室),visual-studio-2008,memory-leaks,resource-leak,Visual Studio 2008,Memory Leaks,Resource Leak,背景:我正在编写一些代码来读取文件中的数据。数据示例用换行符分隔。此外,数据还有一个元级别,分号充当分隔符,表示序列已到达末尾。该文件包含许多序列。我想打开文件,读入一行数据并将其存储为向量,对数据做一些处理,然后读入下一行。。。直到文件结束 下面的编译很好,在我的linux机器上使用valgrind运行时,没有发现内存泄漏。但是,当我在实验室的Windows机器上使用并行监视器工具的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
类网络;
命名空间数据{
静态标准::字符串trainfiles[]={
“/home/samurain/htm_check/data_files/train/sequence1.train”,
“/home/samurain/htm_check/data_files/train/sequence2.train”};
静态标准::字符串测试文件[]={
“/home/samurain/htm_check/data_files/train/sequence1.train”,
“/home/samurain/htm_check/data_files/train/sequence2.train”};
}
常量char SEQ_DELIM=';';
结构示例
{
向量刺激;
std::fstream数据;
bool clear(){stimulus.clear();}
bool open_文件(标准::字符串和文件名)
{
data.open(filename.c_str());
如果(!数据)
{
可能,Parallel Studio抱怨的是您公开了基本的文件操作(打开、关闭、读取)对于您的类的任何用户,使您的示例
类比std::fstream
上的一个有点笨拙的包装器多一点,并进行一点数据验证。特别是,您没有强制示例
的用户以正确的方式调用打开
和关闭
这并不影响valgrind,因为它是一个非常不同的工具。valgrind会在程序运行时监视程序,以确保它不会发生任何愚蠢的事情,比如泄漏内存或内核资源,而这可能不会发生。PS正在进行某种静态分析,以查看是否有可能泄漏资源,在这种情况下,您将id(即使你没有继续利用这种可能性)
我会重写这个类,使其更像C++语言。特别是,open\u file()
应该是一个构造函数,而不是一个可以随时调用的方法。close\u file()
应该等价地是析构函数,而不仅仅是一些随机方法。这应该满足并行工作室的要求,而内核资源不能(通常)被泄漏,除非对象本身被泄漏(它可能会捕捉到其他地方的可能性,但在任何情况下,如果整个对象被泄漏,这不是你的类的错)
不确定PS对内存泄漏的抱怨是什么;这一行在我看来很好。除非关于std::stringstream
有什么不明显的地方我已经忘记了。谢谢你的提示。关于Valgrind和PS的好信息!