Eu tenho uma pergunta básica sobre os ponteiros const. Não tenho permissão para chamar funções de membro não const usando um ponteiro const. No entanto, tenho permissão para fazer isso em um ponteiro const:
delete p;
Isso chamará o destruidor da classe que, em essência, é um 'método' não const. Por que isso é permitido? É apenas para apoiar isto:
delete this;
Ou tem alguma outra razão?
c++
constants
delete-operator
Naveen
fonte
fonte
const Foo * f
ouFoo const * f
não é um ponteiro const para Foo. É pontual para const Foo.Foo * const f
é um ponteiro const para Foo.Coloque desta forma - se não fosse permitido, não haveria como deletar objetos const sem usar const_cast.
Semanticamente, const é uma indicação de que um objeto deve ser imutável. Isso não significa, entretanto, que o objeto não deva ser excluído.
fonte
Sim você é.
class Foo { public: void aNonConstMemberFunction(); }; Foo* const aConstPointer = new Foo; aConstPointer->aNonConstMemberFunction(); // legal const Foo* aPointerToConst = new Foo; aPointerToConst->aNonConstMemberFunction(); // illegal
Você confundiu um ponteiro const para um objeto não const, com um ponteiro não const para um objeto const.
Tendo dito isto,
delete aConstPointer; // legal delete aPointerToConst; // legal
é legal excluir qualquer um, pelos motivos já expostos nas outras respostas aqui.
fonte
Construtores e destruidores não devem ser vistos como 'métodos'. Eles são construções especiais para inicializar e destruir um objeto de uma classe.
'const pointer' é para indicar que o estado do objeto não seria alterado quando as operações são realizadas nele enquanto ele está ativo.
fonte
Outra maneira de ver: o significado preciso de um ponteiro const é que você não será capaz de fazer alterações no objeto apontado que seria visível por meio desse ou de qualquer outro ponteiro ou referência ao mesmo objeto. Mas quando um objeto é destruído, todos os outros ponteiros para o endereço anteriormente ocupado pelo objeto agora excluído não são mais ponteiros para esse objeto . Eles armazenam o mesmo endereço, mas esse endereço não é mais o endereço de nenhum objeto (na verdade, ele logo poderá ser reutilizado como o endereço de um objeto diferente).
Essa distinção seria mais óbvia se os ponteiros em C ++ se comportassem como referências fracas, ou seja, assim que o objeto fosse destruído, todos os ponteiros existentes para ele seriam imediatamente definidos como
0
. (Esse é o tipo de coisa considerada muito cara em tempo de execução para ser imposta a todos os programas C ++ e, na verdade, é impossível torná-la totalmente confiável.)ATUALIZAÇÃO : Lendo isto nove anos depois, é um advogado-ish. Agora acho sua reação original compreensível. Não permitir a mutação, mas permitir a destruição, é claramente problemático. O contrato implícito de ponteiros / referências const é que sua existência funcionará como um bloqueio na destruição do objeto de destino, também conhecido como coleta de lixo automática.
A solução usual para isso é usar quase qualquer outra linguagem.
fonte
std::unique_ptr<const T>
fim da vida?