Один из лучших инструментов использует эти Средства отладки для Windows и берет дамп памяти процесса с помощью adplus, затем используйте windbg и плагин sos для анализа памяти процесса, потоков и стеков вызовов.
можно использовать этот метод для идентификации проблем на серверах также, после установки инструментов, совместно использовать каталог, затем соединиться с долей от использования сервера (сетевое использование) и или взять катастрофический отказ или подвесить дамп процесса.
Тогда анализируют офлайн.
Я думаю, что вам нужно опубликовать свой вызывающий код, но основная проблема заключается в следующем.
У вас есть конкретный класс Polygon
, производный от другого конкретного класса ] Сущность
. Ваши функции addEntity и getEntity принимают и возвращают Entity
по значению , поэтому, если вы попытаетесь передать или получить Entity
, вы скопируете только Entity
] части этого объекта (разрезая его), и информация о производной части объекта будет потеряна.
Кроме того, у вас есть вектор
из Entity
, который является вектор объектов базового класса, поэтому у вас нет возможности сохранить что-либо, кроме базового типа объекта.
Если вам нужна коллекция объектов смешанного типа, но все они производные от Entity
, вам может потребоваться использовать динамически создаваемые объекты и какой-то интеллектуальный указатель, такой как tr1 :: shared_ptr
или boost :: shared_ptr
.
Например
class Scene {
private:
// -- PRIVATE DATA ------
vector< std::tr1::shared_ptr<Entity> > entityList;
public:
// -- STRUCTORS ---------
Scene();
// -- PUBLIC METHODS ----
void addEntity( const std::tr1::shared_ptr<Entity>& ); // Add entity to list
const std::tr1::shared_ptr<Entity> getEntity(int); // Get entity from list
int entityCount();
};
Edit
] Ваш обновленный код вызова в основном правильный, хотя использование локальной константной ссылки на общий указатель немного неясно.
Я бы, вероятно, выбрал что-то вроде:
std::tr1::shared_ptr<Polygon> poly( new Polygon );
poly->addVertex(Point2D(100,100));
poly->addVertex(Point2D(100,200));
poly->addVertex(Point2D(200,200));
poly->addVertex(Point2D(200,100));
scene->addEntity(poly);
Комментарий холлиды правильный: вы нажимаете объект типа Polygon в область памяти, предназначенную для типов Entity, и запускается в так называемое срезание . Дополнительная информация «Многоугольник» удаляется, и все, что у вас остается, - это сущность.
Для этого вам следует использовать чистую виртуальную функцию.
class Entity
{
public:
virtual void draw() = 0;
};
Затем вызовите функцию рисования из вашего объекта, и вы также должны использовать указатели на свои объекты.
Вы должны в первую очередь хранить указатели (предпочтительно умные указатели :)) на экземпляры Entity. Вектор перераспределяется при вставке, поэтому ваши объекты нарезаются еще до вызова метода получения.
Тип возврата для метода получения также должен быть указателем или ссылкой, чтобы вы могли выполнить этот полиморфный вызов.
Как показывает практика, вы всегда должны использовать семантику ссылок (т. Е. Доступ к объектам через указатели или ссылки) вместо семантики значений при работе с объектами, которые вы собираетесь использовать полиморфно.
Чтобы обеспечить безопасность таким образом, разумно сделать базовый класс всех ваших полиморфных типов некопируемыми , создав конструктор частного копирования и оператор присваивания. Это эффективно предотвратит нарезку, поскольку код просто не будет компилироваться, если семантика значения будет использована по ошибке.