2014-02-24 3 views
1

Я использую вектор с моим собственным типом класса:Работы с памятью, при использовании зОго :: вектора

std::vector<CItem> m_vItems; 

В моем классе я инициализация типов SFML как текстуры и спрайт:

class CItem 
{ 
    (...) 
    sf::Texture m_Texture; 
    sf::Sprite m_Sprite; 
    sf::IntRect* m_pRect; 
    (...) 
} 

Я пытаюсь передать объект в мой вектор объявлен как член другого класса CLevel, и я делаю это внутри метода этого класса, как это:

CItem *temp = new CItem(x, y, kind); 
m_vItems.push_back(*temp); 

Как вы видите, я не deleteing temp указателя с delete, но в деструкторе класса CLevel У меня есть простая линия:

std::vector<CItem>().swap(m_vItems); 

И я немного запутался об утечках памяти. У моей программы есть некоторые из этих или линии выше решения проблемы, и мой пример был правильно написан?

+0

введите код деструктора – 4pie0

+0

Какой деструктор? CItem или CLevel? – Gucu112

ответ

1
CItem *temp = new CItem(x, y, kind); 
m_vItems.push_back(*temp); // here a copy of *temp is pushed into vector 

Вы должны позвонить удалить где удалить то, что вы наделенный температуры:

delete temp; 

, чтобы избежать утечки памяти. Любой звонок new должен иметь соответствующий звонок до delete. Это не влияет на копию темпа, который был перенесен в вектор. Он все еще существует до тех пор, пока существует вектор.

Лучше всего использовать только:

m_vItems.push_back(CItem(x, y, kind)); // implement this constructor correctly 
             // to avoid uninitialized variables 

Всегда, когда Утечки беспокойство можно профилировать программу с инструментом: Valgrind или Визуальный детектор утечек.

2

Ваша программа вызывает new без соответствия delete, и она не передала результат new другому классу, который будет управлять им для вас. Поэтому ваша программа имеет утечку памяти.

У вас возникли проблемы с использованием m_vItems.push_back(CItem(x, y, kind)); вместо двух приведенных вами строк?

+0

Когда я использую его так, после того, как в конце метода у кончика спрайта есть неправильные случайные значения ширины и высоты. – Gucu112

+1

правильно реализовать этот конструктор, чтобы избежать неинициализированных переменных – 4pie0

0

Если вы находитесь на платформе Windows, вы можете использовать библиотеку CRT, чтобы определить, есть ли у вас какие-либо утечки в определенном разделе кода. В этом link объясняется, как это сделать в VS 2012, он также доступен для более ранних версий.

0

Предполагая, что вам нужно сохранить вектор указателей, а не вектор CItems, я бы использовал умный указатель для управления временем жизни объекта. shared_ptr проста в использовании:

shared_ptr<CItem*> temp(new CItem(x,y,z)); 
m_vItems.push_back(temp); 

Когда вектор идет, CItem будет очищен правильно. Когда элементы передаются, они также будут обрабатываться правильно - утечки памяти отсутствуют.

0

Утечка памяти - это когда пространство выделено в куче (в вашем случае путем вызова нового), и ссылка на эту память теряется. Другими словами, у вас нет возможности восстановить память, вызвав delete. Если вы используете swap для перемещения указателей от одного вектора к другому, тогда технически это не утечка, потому что у вас все еще есть ссылка на память в другом векторе, и вы все равно можете вызвать delete.

Не забудьте позвонить в конечном итоге. В некоторых случаях может возникнуть соблазн в зависимости от использования, чтобы просто позволить очистке системы позже и не удалять память когда-либо, например. если код является CGI. Однако это может вызвать проблемы позже, когда код используется в прецеденте, который не был первоначально ожидаемым, например. единичный тест, который вызывается из долговременной структуры. Обычно стоит указать код удаления сразу, даже если это не влияет на ближайшую цель, вместо того, чтобы поставить себя на место, где вам, возможно, придется повернуть назад и попытаться исправить его позже.

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