Padrões de Gestão de Memória
Visão Geral das Estratégias de Gestão de Memória
Os padrões de gestão de memória ajudam os desenvolvedores a lidar eficientemente com a alocação dinâmica de memória e a prevenir problemas comuns relacionados à memória.
RAII (Aquisição de Recurso é Inicialização)
class ResourceManager {
private:
int* data;
public:
ResourceManager(size_t size) {
data = new int[size];
}
~ResourceManager() {
delete[] data;
}
};
Padrões de Ponteiros Inteligentes
graph TD
A[Ponteiros Inteligentes] --> B[std::unique_ptr]
A --> C[std::shared_ptr]
A --> D[std::weak_ptr]
Padrão de Ponteiro Único
std::unique_ptr<int> createUniqueResource() {
return std::make_unique<int>(42);
}
Padrão de Ponteiro Compartilhado
std::shared_ptr<int> sharedResource = std::make_shared<int>(100);
auto anotherReference = sharedResource;
Estratégias de Gestão de Memória
| Estratégia |
Descrição |
Caso de Uso |
| Transferência de Propriedade |
Semântica de movimentação |
Gestão eficiente de recursos |
| Contagem de Referências |
Propriedade compartilhada |
Ciclos de vida de objetos complexos |
| Referências Fracas |
Referências não proprietárias |
Quebra de dependências circulares |
Padrão de Excluidor Personalizado
auto customDeleter = [](int* ptr) {
std::cout << "Exclusão personalizada" << std::endl;
delete ptr;
};
std::unique_ptr<int, decltype(customDeleter)>
customPtr(new int(50), customDeleter);
Padrão de Pool de Memória
class MemoryPool {
private:
std::vector<int*> pool;
public:
int* allocate() {
if (pool.empty()) {
return new int;
}
int* mem = pool.back();
pool.pop_back();
return mem;
}
void deallocate(int* ptr) {
pool.push_back(ptr);
}
};
Gestão de Memória Singleton
class Singleton {
private:
static std::unique_ptr<Singleton> instance;
Singleton() = default;
public:
static Singleton& getInstance() {
if (!instance) {
instance = std::unique_ptr<Singleton>(new Singleton());
}
return *instance;
}
};
Técnicas Avançadas de Gestão de Memória
Placement New
char buffer[sizeof(MyClass)];
MyClass* obj = new (buffer) MyClass();
// Colocação de memória personalizada
Anti-padrões de Gestão de Memória
- Evite a manipulação de ponteiros brutos
- Minimize a gestão manual de memória
- Prefira ponteiros inteligentes da biblioteca padrão
- Utilize semântica de movimentação para eficiência
Recomendação do LabEx
No LabEx, enfatizamos técnicas modernas de gestão de memória C++ que priorizam segurança e desempenho.
Estratégias de Prevenção de Erros
template<typename T>
class SafePointer {
private:
T* ptr;
public:
SafePointer(T* p) : ptr(p) {
if (!ptr) throw std::runtime_error("Ponteiro nulo");
}
~SafePointer() { delete ptr; }
};
Conclusão
Uma gestão eficaz de memória requer a compreensão de padrões, o uso de recursos modernos do C++, e a adoção de boas práticas para criar software robusto e eficiente.