Pergunta

class someClass
{
public:
    int* ptr2Int;
};

Esta é uma classe válida (sim, compila)? Desde que se atribua um valor ao PTR2INT antes de desreferente -o, a classe é garantida para funcionar como seria de esperar?

Foi útil?

Solução

Um ponteiro não inicializado dentro de uma classe não é de forma alguma diferente de um ponteiro não iniciado independente. Contanto que você não esteja usando o ponteiro de maneira perigosa, você está bem.

Lembre -se de que "maneiras perigosas" de usar um ponteiro não inicializado incluem uma mera tentativa de ler seu valor (sem necessidade de desreferência). Os operadores implícitos fornecidos pelo compilador e dos operadores de assinatura de cópias presentes em sua classe podem executar essa tentativa se você usar essas funções implícitas de membro antes que o ponteiro seja atribuído um valor válido.

Na verdade, se não me engano, essa questão foi uma questão de alguma discussão no nível do comitê de padronização. As funções membros geradas implicitamente podem tropeçar em representações de armadilha possivelmente presentes nos membros não iniciados da classe? Não me lembro do que era o veredicto. (Ou talvez eu tenha visto essa discussão no contexto de C99?)

Outras dicas

Sim, tudo bem. O ponteiro em si existe, apenas seu valor é desconhecido, então desreferencia -o é inseguro. Ter uma variável não inicializada é perfeitamente bem, e os ponteiros não são diferentes

Sim, isso é exatamente o mesmo que um struct Com um único ponteiro não inicializado, e ambos têm a garantia de funcionar bem (desde que você defina o ponteiro antes de qualquer uso dele, é claro).

Até você desreferenciar o ponteiro, tudo é bom, então é território indefinido.

Alguns compiladores definem ponteiros para valores padrão (como nulo), dependendo se você compilar no modo de depuração ou liberação. Para que as coisas pudessem funcionar em um modo e de repente tudo desmorona em outro.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top