Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 2008 这是内存泄漏吗?内核资源泄漏?(C+;+;,平行工作室)_Visual Studio 2008_Memory Leaks_Resource Leak - Fatal编程技术网

Visual studio 2008 这是内存泄漏吗?内核资源泄漏?(C+;+;,平行工作室)

Visual studio 2008 这是内存泄漏吗?内核资源泄漏?(C+;+;,平行工作室),visual-studio-2008,memory-leaks,resource-leak,Visual Studio 2008,Memory Leaks,Resource Leak,背景:我正在编写一些代码来读取文件中的数据。数据示例用换行符分隔。此外,数据还有一个元级别,分号充当分隔符,表示序列已到达末尾。该文件包含许多序列。我想打开文件,读入一行数据并将其存储为向量,对数据做一些处理,然后读入下一行。。。直到文件结束 下面的编译很好,在我的linux机器上使用valgrind运行时,没有发现内存泄漏。但是,当我在实验室的Windows机器上使用并行监视器工具的C++监视器工具时,它会报告程序中与内存相关的错误,这两个文件都在。 据报告,内存泄漏似乎源于以下线路:

背景:我正在编写一些代码来读取文件中的数据。数据示例用换行符分隔。此外,数据还有一个元级别,分号充当分隔符,表示序列已到达末尾。该文件包含许多序列。我想打开文件,读入一行数据并将其存储为向量,对数据做一些处理,然后读入下一行。。。直到文件结束

下面的编译很好,在我的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的好信息!