Vou adivinhar:
O construtor e destruidor de C ++ não são funções: são macros. Eles são incorporados no escopo onde o objeto é criado e no escopo em que o objeto é destruído. Por sua vez, não há construtor nem destruidor, o objeto é apenas IS.
Na verdade, acho que as outras funções da classe também não são funções, mas funções inline que NÃO são incorporadas porque você usa o endereço delas (o compilador percebe que você está interessado nela e não alinha ou alinha o código na função e otimiza essa função) e, por sua vez, a função parece "ainda estar lá", mesmo que não estivesse se você ainda não o tivesse abordado.
A tabela virtual do "objeto" do C ++ não é como um objeto JavaScript, onde você pode obter seu construtor e criar objetos a partir dele em tempo de execução new XMLHttpRequest.constructor, mas uma coleção de ponteiros para funções anônimas que atuam como meio de interface com esse objeto , excluindo a capacidade de criar o objeto. E nem faz sentido "excluir" o objeto, porque é como tentar excluir uma estrutura, você não pode: é apenas um rótulo de pilha, basta escrever nele como quiser sob outro rótulo: você é livre para use uma classe como 4 números inteiros:
/* i imagine this string gets compiled into a struct, one of which's members happens to be a const char * which is initialized to exactly your string: no function calls are made during construction. */
std::string a = "hello, world";
int *myInt = (int *)(*((void **)&a));
myInt[0] = 3;
myInt[1] = 9;
myInt[2] = 20;
myInt[3] = 300;
Não há vazamento de memória, não há problemas, exceto que você efetivamente desperdiçou um monte de espaço de pilha reservado para a interface do objeto e a cadeia de caracteres, mas isso não destruirá seu programa (desde que você não tente usá-lo) como uma corda novamente).
Na verdade, se minhas suposições anteriores estiverem corretas: o custo completo da string é apenas o custo de armazenar esses 32 bytes e o espaço constante da string: as funções são usadas apenas em tempo de compilação e também podem ser incorporadas e descartadas depois o objeto é criado e usado (como se você estivesse trabalhando com uma estrutura e se referisse a ela diretamente sem nenhuma chamada de função, verifique se há chamadas duplicadas em vez de saltos de função, mas isso geralmente é mais rápido e ocupa menos espaço). Em essência, sempre que você chama alguma função, o compilador substitui essa chamada pelas instruções para literalmente fazê-lo, com exceções que os designers de linguagem definiram.
Resumo: objetos C ++ não têm idéia do que são; todas as ferramentas para interagir com eles são alinhadas estaticamente e perdidas no tempo de execução. Isso torna o trabalho com classes tão eficiente quanto o preenchimento de estruturas com dados e o trabalho direto com esses dados sem chamar nenhuma função (essas funções são incorporadas).
Isso é completamente diferente das abordagens do COM / ObjectiveC e do javascript, que retêm as informações de tipo dinamicamente, ao custo de tempo de execução, gerenciamento de memória, chamadas de construções, pois o compilador não pode jogar essas informações fora: é necessário para envio dinâmico. Isso, por sua vez, nos dá a capacidade de "conversar" com o nosso programa em tempo de execução e desenvolvê-lo enquanto estiver em execução, tendo componentes refletíveis.