Apontadores e memória

Endereços, aliases, limites, duração de vida, new e delete, propriedade e RAII.

TLDR

Perguntar sobre esta página

ChatGPTClaudePerplexityGrokGeminiCopiar e abrirDeepSeekCopiar e abrir

Copiar seta ou objeto?

int a = 3, b = 8;
int* p = &a;
int* q = p;   // copia o endereço, não o inteiro
*q += 2;      // a passa a 5
p = &b;       // só p muda de destino
*p -= 1;      // b passa a 7; *q continua 5
DeclaraçãoMuda destino?Altera por esse acesso?
int*SimSim
const int*SimNão
int* constNãoSim
const int* constNãoNão
  • nullptr testa-se, não se desreferencia.
  • const int* não congela um original modificável: outro acesso pode alterá-lo.
  • A conversão que retira const não é, por si, comportamento indefinido. Escrever através do acesso obtido é indefinido se o objeto era originalmente const.

Limites e vida

  • p + i avança i elementos no mesmo array. p[i] é *(p + i).
  • [inicio, fim) inclui o início e exclui o fim. O fim marca, não se lê.
  • Automático morre no fim do bloco. Dinâmico vive até o dono destruir.
  • Devolver &local deixa endereço pendente.
  • p->campo é (*p).campo. Nós ligam-se por seguinte, não por p + 1.

Libertar lista dinâmica: guarda o seguinte antes de apagar o atual.

while (atual != nullptr) {
    No* seguinte = atual->seguinte;
    delete atual;
    atual = seguinte;
}

Quem liberta?

ReservaLibertação
new T(...)delete
new T[n]delete[]
  • Trocar as formas é indefinido. new normal lança bad_alloc se falha.
  • Não apliques delete a automáticos. delete nullptr não faz nada.
  • Depois de delete p, os outros acessos a esse objeto ficam pendentes. Atribuir p = nullptr só limpa esse nome.

RAII: o dono liberta na saída do âmbito, incluindo por exceção.

auto primeiro = std::make_unique<int>(7);
int* observador = primeiro.get();  // só observa
auto segundo = std::move(primeiro);  // segundo passa a dono

unique_ptr não se copia. shared_ptr partilha com custo. weak_ptr observa sem prolongar.

Transferência de propriedade.

À tua maneira

Aparência

Modo de cor
Tema
Cor de destaque

Leitura

Fonte de leitura

Álgebra, lógica e uma ideia de cada vez.

Código

Fonte do código

Navegação

Cursor de leitura, sem edição. h, j, k, l movem; / pesquisa nesta página. v seleciona caracteres; V seleciona linhas; y copia. Tab permite destacar ou comentar. Espaço ou Enter abre blocos recolhíveis. Nos cartões, h, j, k, l mudam o foco.

CSS personalizado

Ativa uma sugestão ou guarda o teu CSS. Só muda este navegador.

Usa --page, --text e --accent para acompanhar o tema.

Seletores e recuperação

.site-header, .prose, .course-card, [data-reading-history], [data-playground] e .page-actions.

Abre a aparência com a tecla vírgula ou no rodapé. Se o CSS esconder os controlos, abre esta página sem CSS personalizado.

Pesquisar

Escreve para pesquisar em todo o site.

para escolher · Enter para abrir · Esc para fechar

Copiar fórmula

A cópia automática não está disponível. Copia o LaTeX abaixo.

Pesquisar nesta página

Enter procura · n / N repetem · Esc cancela. Ctrl / Cmd K pesquisa todo o site.

Atalhos de teclado

Clica numa tecla para a mudar. Esc cancela. Backspace desativa.

PesquisarCtrl / Cmd K

Os atalhos não interferem enquanto escreves. Tab e Enter funcionam sempre.