C ++

Vida útil do objeto e duração do armazenamento em C ++

Vida útil do objeto e duração do armazenamento em C ++
Ao criar um objeto, sua localização na memória deve ser estabelecida, antes de ser inicializado. Inicialização significa colocar valor no local. O tempo de vida de um objeto começa logo após a inicialização. Quando um objeto morre, sua localização (armazenamento), que o objeto ocupava é liberada e então o computador é desligado ou o armazenamento é ocupado (usado) por outro objeto. Liberar um meio de armazenamento, tornando o identificador ou ponteiro que ocupou o armazenamento, inválido. A vida útil de um objeto termina, quando seu armazenamento é liberado.

Algum tempo é necessário para criar um objeto. Algum tempo é necessário para matar um objeto. Ao falar sobre um objeto, duas coisas estão envolvidas: a localização que é o armazenamento e o valor. O significado de tempo de vida e duração de armazenamento são semelhantes; mas a duração é vista mais do ponto de vista da localização do que do ponto de vista do valor. A duração do armazenamento é o tempo desde quando um local é associado a um objeto até o momento em que o local é dissociado do objeto.

O restante deste artigo ilustra a vida útil do objeto e explica resumidamente as diferentes durações de armazenamento. Você deve ter conhecimento básico em C ++ para entender este artigo. Você também deve ter conhecimento no escopo C ++.

Conteúdo do Artigo

Ilustração da vida útil do objeto

Considere o seguinte programa:

#incluir
usando namespace std;
int main ()

if (1 == 1)

int x;
x = 1;
char y;
y = 'A';
cout << x << y << '\n';

return 0;

A saída é, 1A .

A vida de um objeto chega ao fim, quando sai do escopo. O tempo de vida do objeto x começa em “x = 1;” e termina no final do escopo if-local. O tempo de vida do objeto y começa em “y = 'A';” e termina no final do escopo if-local. Antes de ambos os objetos morrerem, eles são empregados na declaração cout .

Duração do Armazenamento

A duração do armazenamento é determinada por um dos seguintes esquemas: duração automática do armazenamento; duração do armazenamento dinâmico; duração do armazenamento estático; duração do armazenamento do thread. Categorias de duração de armazenamento, também se aplicam a referências.

Duração de armazenamento automático

Se uma variável não for declarada explicitamente como static, thread_local ou extern, então essa variável tem duração de armazenamento automática. Os exemplos são xey acima. A duração de tais variáveis ​​termina quando elas saem do escopo. O programa a seguir ilustra a duração do armazenamento automático para uma referência e um ponteiro, no escopo global.

#incluir
usando namespace std;
int x = 1;
int & m = x;
char y = 'A';
char * n = & y;
int main ()

cout << m << *n << '\n';
return 0;

A saída é, 1A .

A duração de m começa em “int & m = x;” e termina no final do programa. A duração de n começa em “char * n = & y;” e termina no final do programa.

Duração do armazenamento dinâmico

Loja Gratuita

Em um computador moderno, mais de um programa pode ser executado ao mesmo tempo. Cada programa tem sua própria porção de memória. O resto da memória que não está sendo usada por nenhum programa é conhecido como free store. A seguinte expressão é usada para retornar a localização de um inteiro da loja gratuita

novo int

Este local (armazenamento) para o inteiro, retornado, ainda deve ser identificado por atribuição a um ponteiro. O código a seguir ilustra como usar o ponteiro com loja gratuita:

int * ptrInt = new int;
* ptrInt = 12;
cout<< *ptrInt <<'\n';

A saída é 12 .

Para pôr fim à vida do objeto, use a expressão delete da seguinte maneira:

delete ptrInt;

O argumento para a expressão de exclusão é um ponteiro. O código a seguir ilustra seu uso:

int * ptrInt = new int;
* ptrInt = 12;
delete ptrInt;

Um ponteiro criado com a nova expressão e excluído com a expressão de exclusão tem duração de armazenamento dinâmico. Este ponteiro morre quando sai do escopo ou é excluído. A duração do objeto no código anterior começa em “* ptrInt = 12;” e termina no final da região declarativa (escopo). Há mais nas expressões new e delete do que foi discutido aqui - veja mais tarde.

Duração do armazenamento estático

Objeto estático

Um objeto declarado estático, se comporta como um objeto comum, exceto que sua duração de armazenamento, começa a partir de quando é inicializado até o final do programa. Não pode ser visto fora de seu escopo, mas pode ser indiretamente empregado fora de seu escopo.

Considere o seguinte programa, que deve contar de 1 a 5 (não teste o programa):

#incluir
usando namespace std;
int fn ()

int stc = 1;
cout << " << stc;
stc = stc + 1;
if (stc> 5)
return 0;
fn ();

int main ()

fn ();
return 0;

A saída é 1 1 1 1 1 1 1 1 ... e nunca realmente terminando. A definição da função é uma função recorrente; o que significa que continua chamando a si mesmo até que uma condição seja atendida.

A solução é tornar o objeto stc estático. Uma vez que um objeto estático tenha sido inicializado, seu valor não pode ser alterado, até que o programa termine. O seguinte programa (que você pode testar), que é igual ao anterior, mas agora com stc tornado estático, conta de 1 a 5:

#incluir
usando namespace std;
int fn ()

estático int stc = 1;
cout << " << stc;
stc = stc + 1;
if (stc> 5)
return 0;
fn ();

int main ()

fn ();
return 0;

O resultado é: 1 2 3 4 5 .

Nota: A duração de um objeto estático começa quando o objeto foi inicializado e termina no final do programa. Nesse ínterim, o objeto pode ser usado indiretamente, de um escopo diferente. Uma vez que um objeto estático tenha sido inicializado, seu valor inicial não pode ser alterado, mesmo se sua definição for reavaliada. No código acima, o stc não é zerado, na próxima vez que for chamado. Na próxima vez que for chamado, ele será incrementado por “stc = stc + 1;”.

Membro de dados estáticos

Um conjunto de variáveis ​​e funções relacionadas pode ser colocado em uma unidade generalizada chamada classe. Se as variáveis ​​recebem valores específicos, a classe se torna um objeto. No entanto, um objeto não é criado apenas atribuindo valores à variável. A classe é instanciada para obter um objeto; e cada objeto criado tem seu próprio nome diferente de outros objetos da mesma classe. O programa a seguir mostra uma classe, chamada TheCla e um objeto, chamado obj; também mostra como o objeto é instanciado e usado na função main ():

#incluir
usando namespace std;
classe TheCla

público:
int num;
void func (char cha, const char * str)

cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';

;
int main ()

TheCla obj;
obj.num = 12;
obj.func ('$', "500");
return 0;

O resultado é:

Existem 12 livros no valor de $ 500 na loja.

Observe que, para atribuir o valor 12 à variável num, o objeto deve ser instanciado, antes que a atribuição possa ocorrer. É possível para o programador atribuir o valor sem instanciar (criar) um objeto. Para conseguir isso, a variável, num terá que ser declarada como estática. Em seguida, ele será acessado como “TheCla :: num” sem o nome do objeto, mas com o nome da classe. O programa a seguir ilustra isso:

#incluir
usando namespace std;
classe TheCla

público:
estática const int num = 12;
void func (char cha, const char * str)

cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';

;
int main ()

cout << TheCla::num << '\n';
TheCla obj;
obj.func ('$', "500");
return 0;

O resultado é:

12
Existem 12 livros no valor de $ 500 na loja.

Observe que, para acessar o membro de dados, num in main (), o operador de resolução de escopo, :: teve que ser usado. Também não é que a variável, num teve que se tornar constante e inicializada na descrição da classe (definição).

Função de membro estático

Observe que na lista de programas anterior acima, para usar a função func em main (), um objeto teve que ser instanciado. É possível para o programador chamar a função sem instanciar (criar) um objeto. Para conseguir isso, a definição da função deve ser precedida da palavra "estática". Em seguida, ele será acessado como “TheCla :: func ()” sem o nome do objeto, mas com o nome da classe. O programa a seguir ilustra isso para membro de dados estáticos e função de membro estático:

#incluir
usando namespace std;
classe TheCla

público:
estática const int num = 12;
função void estática (char cha, const char * str)

cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';

;
int main ()

TheCla :: func ('$', "500");
return 0;

O resultado é:

Existem 12 livros no valor de $ 500 na loja.

Duração do armazenamento do thread

Thread como um recurso em C ++, ainda não foi implementado pelo compilador g ++. Portanto, em vez de explicar isso, a citação da especificação C ++ é dada da seguinte forma:

  1. Todas as variáveis ​​declaradas com a palavra-chave thread_local têm duração de armazenamento de thread. O armazenamento para essas entidades deve durar durante o thread em que são criadas. Há um objeto distinto ou referência por thread, e o uso do nome declarado se refere à entidade associada ao thread atual.
  2. Uma variável com duração de armazenamento de thread deve ser inicializada antes de seu primeiro uso odr e, se construída, deve ser destruída na saída do thread.”

Conclusão

O tempo de vida de um objeto começa quando sua inicialização é concluída e termina quando seu armazenamento é liberado. A duração do armazenamento dinâmico começa quando o armazenamento criado por (novo tipo) é inicializado e termina quando o objeto sai do escopo ou é excluído pelo “ponteiro de exclusão”. A duração de um objeto estático começa quando o objeto foi inicializado e termina no final do programa. Uma vez que um objeto estático tenha sido inicializado, seu valor inicial não pode ser alterado, mesmo se sua definição for reavaliada. Membros de dados estáticos e membros de função estáticos são acessados ​​fora da descrição da classe com “ClassName :: name”.

Chrys

5 melhores jogos de arcade para Linux
Hoje em dia, os computadores são máquinas sérias usadas para jogos. Se você não pode obter a nova pontuação máxima, você saberá o que quero dizer. Nes...
Batalha por Wesnoth 1.13.6 Desenvolvimento lançado
Batalha por Wesnoth 1.13.6 lançado no mês passado, é o sexto lançamento de desenvolvimento no 1.13.série x e oferece uma série de melhorias, principal...
Como instalar o League Of Legends no Ubuntu 14.04
Se você é fã de League of Legends, esta é uma oportunidade para testar o funcionamento de League of Legends. Observe que LOL é suportado no PlayOnLinu...