2015-08-19 2 views
-1

Я использовал инструмент CRT для поиска утечек памяти в своем коде, и когда обнаружил, что я исправил одну вещь, и она позаботилась об утечке памяти, но я могу " Не понимаю, что там произошло.Исправлена ​​утечка памяти, и я не понимаю, почему это сработало

Мой исходный код был:

while (getline(inf, line)) 
{ 
    Video vid = *deserialize_video(line); 
    Video_dict[vid.get_name()] = vid; 

} 

где deserialize_video это функция, которая получит строку в качестве входных данных и возвращает указатель на новый объект, созданный в этой функции, типа видеопластиной. То, что я пытаюсь сказать, это функция заканчивается:

возвращения нового видео (название, год, тип, цена, длина, жанр);

После нескольких попыток я закончил с этим кодом:

while (getline(inf, line)) 
{ 
    Video * vid = deseriallize_video(line); 
    Video_dict[vid->get_name()] = *vid; 
    delete vid; 

} 

И решить мои утечки памяти. Проблема в том, что я не могу понять, сколько дубликатов было создано в 1-м, и почему первый код был неправильным, если функция deserialize ... отправляет обратно указатель.

+0

Ну, когда вы вызываете функцию, и она возвращает указатель _and_, вы получаете право собственности на этот указатель, чтобы он удалял _you_, чтобы удалить его. Поскольку вы не удаляли его, у вас закончилась утечка памяти. –

+2

Мы ничего не знаем о 'Video' или' Video_dict' или 'deserialize_video()', но я могу предположить, что не удаление выделенного объекта является причиной утечки памяти. –

+0

, разница между двумя фрагментами кода заключается в том, что вторая устанавливает индекс массива в данные, хранящиеся в значении адреса, где в качестве первого задает индекс массива самому фактическому адресу. – Mike

ответ

4

deseriallize_video является fucntion, что получить строку в качестве входных данных и возвращает указатель на новый объект, созданный в этой функции

Ну, там вы идете!

Этот объект был динамически выделен new и впоследствии должен быть выделен delete.

Это так просто.


Вы сделали несколько копий объекта в своем примере.

Здесь, объект (после того, как указатель разыменовывается) используется для копирования инициализирует новый Video имени vid:

Video vid = *deseriallize_video(line); 

И здесь, предполагая, Video_dict это стандартный контейнер или эквивалентный одному, vid является копируется в него:

Video_dict[vid.get_name()] = vid; 

(BTW вы typo'd что *vid в вашем втором примере.)


Мы достаточно (читайте: ничего) не знаем о Video категорически государственных улучшения, но вполне вероятно, что вы хотите отказаться от динамического распределения и указателей полностью. Возвращайтесь по значению, если можете. Определите конструктивные конструкторы перемещения, если нужно.

+0

Благодарю вас за помощь. Я не хотел добавлять больше кода, потому что я был afriad Я бы изо всех сил пытался объяснить, что я сделал/пытался сделать, что вопрос не будет ясным. Я попробовал то, что вы предложили, и перешел на fucntion, чтобы вернуться по значению > return Video (имя, год, тип, цена, длина, жанр); и теперь код: Video vid = deseriallize_video (line); \t \t Video_dict [vid.get_name()] = vid; Правильнее ли это? – maor

+0

@maor: Я раньше говорил о том, что я не могу ничего категорически заявить, не зная, что делает «Видео» ... не волшебным образом изменилось, потому что вы дали повод для объяснения того, что делает «Видео». –

Смежные вопросы