C++ - O que significa “Pilha automática”?
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?
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?