Как отслеживать использование памяти с помощью EASTL?

Электронное искусство EASTL библиотеки east::allocator требует от пользователя реализовать специальный new оператор (как показано в этом образец). это new оператор имеет const char* name, который должен использоваться для регистрации специфичной для приложения информации о памяти ассигнования выполненные контейнеры EASTL. ВОСТОК Лучшие практики Руководство также упоминает, что нужноИмя контейнера для отслеживания использования памяти.«

Тем не менее, похоже, что const char* name прошло eastl::allocator::deallocate, так что, похоже, не существует встроенного способа записи памяти deallocations.

Как эта функциональность отладки EASTL предназначена для использования? Я думаю, что я что-то упускаю. Инженер программного обеспечения EA также дал презентация в 2015 году, где он продемонстрировал некоторые внутренние инструменты, разработанные EA для отладки памяти, и, кажется, предлагает, чтобы они отслеживали как распределение, так и освобождение (например, для обеспечения освобождения памяти для «уровня игры 1» при «уровне игры 2»). «начинается».

1

Решение

Распределители по EASTL имеют состояние и привязаны к экземпляру контейнера; это означает, что они определены на уровне экземпляра:

Что делает EASTL, так это использует более привычный шаблон распределения памяти
при этом существует только один интерфейс класса распределителя, и он используется
все контейнеры. Кроме того, контейнеры EASTL позволяют получить доступ к их
распределители и запросить их, назвать их, изменить их и т. д.

EASTL решил запретить копирование распределителей между контейнерами
во время смены контейнера и назначения операций. Это означает, что если
Контейнер A меняет свое содержимое на контейнер B, оба контейнера
сохранить свои первоначальные распределители. Аналогично, назначение контейнера A
контейнер B заставляет контейнер B сохранять свой первоначальный распределитель.
Контейнеры, которые эквивалентны, должны сообщать об этом через operator ==; EASTL
сделает умный своп, если распределители равны, и перебор грубой силы
иначе.

от https://github.com/questor/eastl/blob/master/doc/EASTL%20Design.html

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

#ifndef EASTL_CUSTOM_ALLOCATOR_H_
#define EASTL_CUSTOM_ALLOCATOR_H_

#include "new_implementation.hpp"#include <EASTL/list.h>
#include <iostream>

#define DEBUG_MACRO

class EASTL_CustomAllocator {
public:
EASTL_CustomAllocator(const char* pName = EASTL_NAME_VAL(EASTL_ALLOCATOR_DEFAULT_NAME))
: m_pName(pName), m_totalAmountOfBytesAllocated(0) {
#ifdef DEBUG_MACRO
std::cout << m_pName << ": default construct allocator" << std::endl;
#endif
}
EASTL_CustomAllocator(const EASTL_CustomAllocator& x)
: m_pName(x.m_pName),
m_totalAmountOfBytesAllocated(x.m_totalAmountOfBytesAllocated) {
#ifdef DEBUG_MACRO
std::cout << m_pName << ": copy construct allocator" << std::endl;
#endif
}
EASTL_CustomAllocator(const EASTL_CustomAllocator& x, const char* pName)
: m_pName(pName),
m_totalAmountOfBytesAllocated(x.m_totalAmountOfBytesAllocated) {
#ifdef DEBUG_MACRO
std::cout << m_pName << ": copy construct allocator" << std::endl;
#endif
}

EASTL_CustomAllocator& operator=(const EASTL_CustomAllocator& x) {
#ifdef DEBUG_MACRO
std::cout << m_pName << ": copy assignment" << std::endl;
#endif
m_pName = x.m_pName;
m_totalAmountOfBytesAllocated = x.m_totalAmountOfBytesAllocated;
return *this;
}

void* allocate(size_t num_of_bytes, int flags = 0) {
m_totalAmountOfBytesAllocated += num_of_bytes;
void* p = ::new((char*)0, flags, 0, (char*)0,        0) char[num_of_bytes];
#ifdef DEBUG_MACRO
std::cout << m_pName << ": allocate " << num_of_bytes << " bytes" << " at: " << (void*) p << std::endl;
#endif
return p;
}
void* allocate(size_t num_of_bytes, size_t alignment, size_t offset, int flags = 0) {
m_totalAmountOfBytesAllocated += num_of_bytes;
void* p = ::new(alignment, offset, (char*)0, flags, 0, (char*)0,        0) char[num_of_bytes];
#ifdef DEBUG_MACRO
std::cout << m_pName << ": allocate " << num_of_bytes << " bytes" << " at: " << (void*) p << std::endl;
#endif
return p;
}
void  deallocate(void* p, size_t num_of_bytes) {
m_totalAmountOfBytesAllocated -= num_of_bytes;
#ifdef DEBUG_MACRO
std::cout << m_pName << ": deallocate " << num_of_bytes << " bytes" << " at: " << (void*) p << std::endl;
#endif
delete[](char*)p;
}

const char* get_name() const {
return m_pName;
}
void        set_name(const char* pName) {
m_pName = pName;
}
size_t get_totalAmountOfBytesAllocated() const {
return m_totalAmountOfBytesAllocated;
}

protected:
const char* m_pName;    // Debug name, used to track memory.
size_t m_totalAmountOfBytesAllocated;   // keeps track of the memory currently allocated
};bool operator==(const EASTL_CustomAllocator& a, const EASTL_CustomAllocator& b) {
if (&a == &b) {
return true;    // allocator a and b are equal if they are the same
}
else {
return false;   // otherwhise, return false, because the state m_totalAmountOfBytesAllocated needs to be increased/decreased on splice and swap
}
}
bool operator!=(const EASTL_CustomAllocator& a, const EASTL_CustomAllocator& b) {
return false;
}#endif /* EASTL_CUSTOM_ALLOCATOR_H_ */

Передайте этот пользовательский тип распределителя в качестве параметра шаблона в контейнер eastl, как показано ниже (также вы можете установить экземпляр с определенным пользователем именем при создании и даже позже с помощью set_allocator ()):

eastl::list<int, EASTL_CustomAllocator>
list(EASTL_CustomAllocator("EASTL Some Name"));

Но я не уверен, как функциональность отладки предназначена для использования.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector