На C++ Вектор указателей на объекты

Я с помощью вектора указателей на объекты. Эти объекты являются производными от базового класса, и при динамическом выделении и хранении.

Например, у меня что-то вроде:

vector<Enemy*> Enemies; 

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

enemies.push_back(new Monster()); 

Какие вещи я должен знать, чтобы избежать утечек памяти и других проблем?

Одна вещь, чтобы быть очень осторожным, если есть два монстра() производные объекты, содержание которых идентичны в стоимость. Предположим, что вы захотели удалить повторяющиеся объекты чудовище из своего вектора (базовая указатели класса объектов, производных от монстра).

Если используется стандартная идиома для удаления дубликатов (вроде, уникальный, стереть: см. ссылку #2], вы столкнетесь проблемы утечки памяти, и/или дубликаты удалить проблемы, возможно, приведет к сегментации VOIOLATIONS (я лично видел эти проблемы на Linux машине).

Проблема с СТД::уникальный() является то, что дубликаты в [duplicatePosition,конец диапазона) [включено, эксклюзив) в конце вектора не определено, как ?. Что может случиться, что эти неопределенные ((?) элементы могут быть дополнительные дублирующие или отсутствующие двух экземплярах.

Проблема в том, что СТД::уникальный() не предназначена для обработки векторных указателей должным образом. Причина в том, что с STD::уникальные копии уников из конца вектора “вниз” к началу вектора. Для вектора простые объекты, это вызывает конструктор копирования, а если конструктор копирования правильно написано, нет проблемы утечки памяти. Но когда его вектор указателей, нет конструктора копирования, кроме “побитового копирования”, так и сам указатель является просто скопированы.

Есть способы, чтобы решить эти утечки памяти другими, чем использовать умные указатели. Один из способов, чтобы написать свой собственный слегка измененная версия STD::Unique (в) как “название-компании::уникальный()”. Основная фишка в том, что вместо того, чтобы копировать элемент, вам было бы поменять местами два элемента. И вы должны быть уверены, что вместо сравнения двух указателей, вы называете BinaryPredicate, что следует за двумя указателями к себе объект, и сравнить содержимое этих двух “монстров” производные объекты.

1) @SEE_ALSO: http://www.cplusplus.com/reference/algorithm/unique/

2) @SEE_ALSO: самый эффективный способ стереть дубликатов и сортировка на C++ вектор?

2-й ссылке отлично написано, и будет работать на СТД::вектор а имеет утечки памяти, дубликата освобождает (что иногда приводит к сегментации нарушения) для СТД::вектор

3) @SEE_ALSO: с valgrind(1). Этот “инструмент утечка памяти” на Linux-это удивительное в том, что она может найти! Я настоятельно рекомендую использовать его!

Надеюсь, пост хороший вариант “my_company::уникальный()” в следующей статье. Прямо сейчас, не идеальный, потому что я хочу 3-арг версии, имеющие BinaryPredicate для безупречной работы либо указатель на функцию или ФУНКТОР, и у меня возникли некоторые проблемы с обработкой как правильно. Если я не могу решить эти проблемы, я выложу что у меня есть, и пусть сообщество должны идти на улучшение на то, что я сделал до сих пор.

Спасибо .. я считаю этот веб-сайт, чтобы быть очень полезным.

ЗЫ: следите за обновлениями !!

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...

Оставить комментарий

Ваш email нигде не будет показанОбязательные для заполнения поля помечены *

*