这是内存泄漏吗?内核资源泄漏? (C ++,并行工作室)

时间:2011-04-22 01:53:26

标签: visual-studio-2008 memory-leaks resource-leak

背景:我正在研究一些代码来读取文件中的数据。数据示例由换行符分隔。此外,数据存在元级别,分号充当分隔符以指示到达序列的结尾。该文件包含许多序列。我想打开文件,读取一行数据并将其存储为矢量,对数据做一些事情,然后在下一行读取......直到文件结束。

以下编译很好,当我的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

1 个答案:

答案 0 :(得分:0)

也许,Parallel Studio抱怨的是你向你的班级的任何用户公开了基本的文件操作(打开,关闭,读取),使你的Example类只是一个有点gimped的包装器。在std::fstream附近进行一些数据验证。特别是,您没有以正确的方式强制Example拨打openclose的用户。

这并不打扰valgrind,因为它是一个非常不同的工具。 Valgrind在运行时会监视你的程序,以确保它不会像漏洞或内核资源那样做任何愚蠢的事情,这可能不是。 PS正在进行某种静态分析,看看你是否已经可能泄漏资源,在这种情况下你做了(即使你没有继续实际利用这种可能性)。 / p>

我会把这个类重写成更多的C ++ ish。特别是,open_file()应该是构造函数,而不是可以随时调用的方法。 close_file()应该等同于析构函数,而不仅仅是一些随机方法。这应该满足Parallel Studio内核资源不能(通常)泄露,除非对象本身泄露(它可能会捕获其他地方的可能性,但无论如何,如果整个对象泄露,那么它不是你的类故障)。

不确定PS在内存泄漏方面抱怨什么;这条线看起来很好。除非我忘记了std::stringstream不明显的事情。