Depois de um longo e tenebroso inverno (clichè), estou de volta por conta da sugestão de um cara com quem conviv lá no trabalho por algum tempo e que está indo morar em Fortaleza agora: o maníaco do machado, Emanoel Xavier.

Bem, ontem nas minhas caoticidades (vide “Leituras Caóticas”), estava lendo sobre implementação de Singletons em C++ (e todas as suas dificuldades e gambiarras, mas elocubrações para outro post…) e acabei descobrindo um jeito diferente de dar um new: o placement new.

Segundo a biblioteca padrão de C++, um placement new é somente um overloading de new com passagem de parâmetros adicionais e cuja implementação-padrão não aloca memória. Deixa eu explicar com um exemplo de utilização, depois adentro o mundo das cobras:

Utilização:

class A{
public:
A(){}
~A(){}
...
};
A *p = new A;
...
delete p;
...
p = new (a,b) A; // onde a e b sao objetos ou tipos primitivos quaisquer

Na linha em negrito está o pulo do gato, a sintaxe é diferente do new usual, visto que agora dá pra passar parâmetros.

Bem, eu falei lá em cima que a implementação-padrão não aloca memória, ou seja, em algum dos parâmetros passados no placement new a memória já foi alocada, o que eu quero dizer com isso? A implementação de um placement new parece com algo do tipo:

void *operator new(size_t, void *ondeColocaOObjeto)
{ return ondeColocaOObjeto;}

Vale salientar que o fato de que quando acontece alguma exceção em um construtor o delete correspondente também é chamado, com os mesmos parâmetros e mesma ordem, isto é, quando acontece uma exceção em um placement new com parâmetros a, b e c, o respectivo placement delete com parâmetros a, b e c é chamado.

Anúncios