paulo1205
(usa Ubuntu)
Enviado em 28/04/2015 - 21:34h
Thihup escreveu:
Então, eu consegui resolver esse problema, mas estou com outro :
Aparentemente está chamando o Destrutor da função já no inicio, sendo que em nenhum "momento" uso por exemplo, um delete.
Cuidado com a terminologia. “Destrutor da função” não faz muito sentido (a não ser que você esteja falando de um objeto-função, também chamado “
functor”, que é um objeto de uma classe com sobrecarga do operador
(), de invocação de função). Você se refere ao destrutor de algum objeto declarado dentro da função, certo? Sendo esse o caso, seria interessante você mostrar a nova forma que a função assumiu, depois das modificações que você provavelmente fez depois da primeira mensagem (uma vez que disse que conseguiu resolver o problema inicial).
Na sua primeira postagem, você declarou diretamente um objeto
teste dentro da função. Esse objeto é alocado na pilha, e construído nesse espaço. Quando ele sai do escopo, ele é automaticamente destruído e o espaço da pilha é liberado. O compilador se encarrega disso para você, a fim de que, na medida do possível, o tipo desse objeto (sua classe) se comporte do modo mais parecido possível com tipos nativos (e.g. quando você declara uma variável local do tipo
int ou
double, a declaração já é uma instrução de reserva de espaço, e você também não se preocupa em liberar explicitamente o espaço dessa variável, pois sabe que ele será liberado quando a variável sair de escopo).
Você só teria de chamar explicitamente
delete sobre um ponteiro que tivesse sido alocado por meio de
new, e essa alocação teria provavelmente sido feita não na pilha, mas sim na memória livre (
free store, muitas vezes chamada também de
heap), que não tem nenhuma relação com limites de blocos ou funções.
(Não tenho certeza, mas pelos meus testes não é chamada o construtor).
De qual objeto? De que tipo?
std::string? Se for
std::string, sempre existe um construtor sendo chamado, pois a implementação garante isso (a não ser que você faça algum truque de baixo nível, que eu creio que não é o caso).
De todo modo, não existe relação necessária entre a invocação do destrutor com um dos construtores. Uma classe pode ter vários tipos de construtores, e qual deles será chamado -- se é que algum o será -- depende de como você pedir para criar um objeto dessa classe. Já destrutor, pode haver no máximo um; se ele existir, ele sempre será chamado no momento em que o objeto for destruído.