Pergunta

Em minhas navegações pela Internet, me deparei esta postagem, que inclui este

"(Bem escrito) C ++ se esforça para fazer com que os objetos automáticos da pilha funcionem" como "Primitives, como refletido nos conselhos da Stroustrup para" fazer o que os ints fazem ".Isso requer uma adesão muito maior aos princípios do desenvolvimento orientado a objetos:Sua aula não está certa até que "funcione como" um INT, seguindo a "regra dos três" que garante que ela (assim como um INT) seja criada, copiada e destruída corretamente como uma pilha automática ".

Já fiz um pouco de código C e C++, mas só de passagem, nunca nada sério, mas estou curioso, o que significa exatamente?

Alguém pode dar um exemplo?

Foi útil?

Solução

Objetos de pilha são manipulados automaticamente pelo compilador.

Quando o escopo é deixado, ele é excluído.

{
   obj a;
} // a is destroyed here

Quando você faz o mesmo com um objeto 'novo', ocorre um vazamento de memória:

{
    obj* b = new obj;
}

b não é destruído, então perdemos a capacidade de recuperar a memória que b possui.E talvez pior, o objeto não consegue se limpar sozinho.

Em C é comum o seguinte:

{
   FILE* pF = fopen( ... );
   // ... do sth with pF
   fclose( pF );
}

Em C++ escrevemos isto:

{
   std::fstream f( ... );
   // do sth with f
} // here f gets auto magically destroyed and the destructor frees the file

Quando esquecemos de chamar fclose na amostra C o arquivo não é fechado e não pode ser usado por outros programas.(por exemplo.não pode ser excluído).

Outro exemplo, demonstrando a string do objeto, que pode ser construída, atribuída e que é destruída ao sair do escopo.

{
   string v( "bob" );
   string k;

   v = k
   // v now contains "bob"
} // v + k are destroyed here, and any memory used by v + k is freed

Outras dicas

Além das outras respostas:

A linguagem C++ realmente tem o auto palavra-chave para declarar explicitamente a classe de armazenamento de um objeto.Claro, é completamente desnecessário porque esta é a classe de armazenamento implícita para variáveis ​​locais e não pode ser usada em lugar nenhum.O oposto de auto é static (tanto localmente quanto globalmente).

As duas declarações a seguir são equivalentes:

int main() {
    int a;
    auto int b;
}

Como a palavra-chave é totalmente inútil, ela será reciclada no próximo padrão C++ (“C++0x”) e ganhará um novo significado, ou seja, permitirá que o compilador infira o tipo de variável a partir de sua inicialização (como var em C#):

auto a = std::max(1.0, 4.0); // `a` now has type double.

Variáveis ​​em C++ podem ser declaradas na pilha ou no heap.Quando você declara uma variável em C++, ela vai automaticamente para a pilha, a menos que você use explicitamente o operador new (ele vai para a pilha).

MyObject x = MyObject(params); // onto the stack

MyObject * y = new MyObject(params); // onto the heap

Isso faz uma grande diferença na forma como a memória é gerenciada.Quando uma variável é declarada na pilha, ela será desalocada quando sair do escopo.Uma variável no heap não será destruída até que delete seja explicitamente chamado no objeto.

Pilha automática são variáveis ​​que são alocadas na pilha do método atual.A idéia por trás do projeto de uma classe que pode atuar como Stack automática é que seja possível inicializá-la totalmente com uma chamada e destruí-la com outra.É essencial que o destruidor libere todos os recursos alocados pelo objeto e seu construtor retorne um objeto totalmente inicializado e pronto para uso.Da mesma forma para a operação de cópia - a classe deve poder fazer cópias facilmente, que sejam totalmente funcionais e independentes.

O uso dessa classe deve ser semelhante ao primitivo int, float, etc.são usados.Você os define (eventualmente dá a eles algum valor inicial) e depois os repassa e no final deixa o compilador para a limpeza.

Corrija-me se estiver errado, mas acho que a operação de cópia não é obrigatória para aproveitar ao máximo a limpeza automática da pilha.Por exemplo, considere um objeto MutexGuard clássico, ele não precisa de uma operação de cópia para ser útil como pilha automática, ou precisa?

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