Это утечка памяти? Утечка ресурсов ядра? (С++, параллельная студия)

Справочная информация: я работаю над кодом для чтения данных из файла. Примеры данных разделяются символами новой строки. Кроме того, для данных существует метауровень, а точка с запятой действует как разделитель, указывающий на достижение конца последовательности. Файл содержит много последовательностей. Я хотел бы открыть файл, прочитать строку данных и сохранить его как вектор, сделать что-то с данными, а затем прочитать в следующей строке... до конца файла.

Следующее компилируется нормально, и при запуске с valgrind на моей Linux-машине утечек памяти не обнаружено. Однако, когда я использую инструмент инспектора С++ в 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

person ryguy    schedule 22.04.2011    source источник


Ответы (1)


Вероятно, Parallel Studio жалуется на то, что вы предоставили базовые операции с файлами (открыть, закрыть, прочитать) любому пользователю вашего класса, сделав ваш класс Example немногим больше, чем несколько урезанную оболочку вокруг std::fstream с небольшим количеством проверка данных. В частности, вы не обеспечиваете, чтобы пользователи Example правильно звонили open и close.

Это не беспокоит valgrind, потому что это совсем другой инструмент. Valgrind наблюдает за вашей программой во время ее выполнения, чтобы убедиться, что она не делает ничего глупого, например утечки памяти или ресурсов ядра, чего, по-видимому, не происходит. PS проводит какой-то статический анализ, чтобы увидеть, сделали ли вы возможной утечку ресурсов, что в данном случае вы и сделали (даже если вы не используете эту возможность).

Я бы переписал этот класс, чтобы он был более похож на C++. В частности, open_file() должен быть конструктором, а не методом, который можно вызвать в любое время. close_file() должен быть деструктором, а не просто случайным методом. Это должно убедить Parallel Studio в том, что ресурсы ядра не могут (обычно) утечь, если только сам объект не утечет (что, вероятно, уловит возможность где-то еще, но в любом случае, если весь объект утечет, это не ваш класс). вина).

Не уверен, на что PS жалуется на утечку памяти; эта линия выглядит хорошо для меня. Если только нет чего-то неочевидного в std::stringstream, что я забыл.

person Paul Z    schedule 22.04.2011
comment
Спасибо за чаевые. Хорошая информация о Valgrind и PS! - person ryguy; 24.04.2011