c++ - O construtor padrão inicializa os tipos incorporados?



constructor built-in-types (5)

Como os palestrantes anteriores afirmaram - não, eles não foram inicializados.

Isso é realmente uma fonte de erros realmente estranhos, já que os sistemas operacionais modernos tendem a preencher zeros com regiões de memória recém-alocadas. Se você espera isso, pode funcionar na primeira vez. No entanto, à medida que seu aplicativo continua sendo executado, delete -ing e new -ing objects, você acabará, mais cedo ou mais tarde, em uma situação em que você espera zeros, mas um resto não-zero de um objeto anterior fica.

Então, por que isso, então, não são todos os new dados recém-alocados? Sim, mas nem sempre do sistema operacional. O sistema operacional tende a trabalhar com grandes blocos de memória (por exemplo, 4 MB por vez), de modo que todas as pequenas alocações e desalocações de uma palavra-aqui-três-bytes-lá são tratadas no espaço ocioso e, portanto, não zeradas.

PS. Eu escrevi "tendem a", ou seja, você não pode confiar no sucesso da primeira vez ...

O construtor padrão (criado pelo compilador) inicializa os tipos internos?


De acordo com o padrão, não a menos que você inicialize explicitamente na lista de inicializadores


Não tenho certeza do que você quer dizer, mas:

struct A { int x; };

int a; // a is initialized to 0
A b;   // b.x is initialized to 0

int main() {
    int c;         // c is not initialized
    int d = int(); // d is initialized to 0

    A e;           // e.x is not initialized
    A f = A();     // f.x is initialized to 0
}

Em cada caso em que digo "não inicializado" - você pode descobrir que seu compilador fornece um valor consistente, mas o padrão não exige isso.

Muita mão acenando é jogada ao redor, inclusive por mim, sobre como tipos internos "em efeito" possuem um construtor padrão. Na verdade, a inicialização e a inicialização do valor padrão são termos definidos no padrão, que, pessoalmente, tenho de procurar em todas as ocasiões. Apenas classes são definidas no padrão para ter um construtor padrão implícito.


Não. O construtor padrão aloca memória e chama o construtor sem argumento de qualquer pai.


Tecnicamente, eles são inicializados - usando seu construtor padrão, que incidentalmente não faz nada além de alocar a memória para eles.

Se o que você queria saber é se eles estão definidos como algo sã como 0 para int s, então a resposta é "não".





built-in-types