Sobes.tech
Junior

Onde os objetos são armazenados na memória?

sobes.tech IA

Resposta da IA

Os objetos na memória são armazenados em diferentes áreas, dependendo do seu tipo, tempo de vida e da linguagem de programação/ambiente de execução escolhido. Áreas principais:

  • Heap (Montão): Memória alocada dinamicamente para objetos cujo tempo de vida não é determinado pelo compilador na fase de compilação. A gestão de memória no heap é feita por um coletor de lixo (em linguagens com gestão automática) ou manualmente (em linguagens sem ela).
  • Stack (Pilha): Usada para armazenar tipos de dados primitivos (inteiros, valores booleanos), referências a objetos no heap, variáveis locais e informações de chamadas de funções. A memória na pilha é alocada e liberada automaticamente ao entrar e sair de blocos de código/funções.
  • Área estática (Segmento de Dados Estáticos/Geral): Armazena variáveis estáticas e globais. O tempo de vida dessas variáveis coincide com o tempo de vida do programa.

Em linguagens orientadas a objetos, a referência ao objeto é armazenada na pilha (ou no heap, se a referência for um campo de outro objeto), e o objeto e seus dados estão no heap.

Exemplo em Java:

class MyObject {
    int value; // Campo do objeto
}

public class Main {
    public static void main(String[] args) {
        int primitiveVar = 10; // primitiveVar é armazenado na pilha
        MyObject objRef = new MyObject(); // objRef (referência) é armazenado na pilha, o objeto new MyObject() (dados) é armazenado no heap
        objRef.value = 20; // Acesso aos dados do objeto no heap
    }
}

Em C++:

#include <iostream>

class MyObject {
public:
    int value;
};

int globalVar = 5; // globalVar é armazenado na área estática

int main() {
    int localVar = 10; // localVar é armazenado na pilha
    MyObject stackObj; // stackObj (objeto) é armazenado na pilha
    stackObj.value = 15;

    MyObject* heapObj = new MyObject(); // heapObj (ponteiro) é armazenado na pilha, new MyObject() (objeto) é armazenado no heap
    heapObj->value = 20;

    delete heapObj; // Liberação manual de memória no heap
    return 0;
}

Tabela comparativa:

Área de memória Propósito Tempo de vida Gestão de memória
Stack Tipos primitivos, referências, variáveis locais Bloco de código/Função Automática
Heap Objetos, estruturas de dados dinâmicas Até liberação explícita/coletores de lixo Automática (coletor de lixo) ou manual
Área estática Variáveis estáticas e globais Tempo de vida do programa Automática