Devo tratar falha de memória?

126 views
Skip to first unread message

Thiago Adams

unread,
May 19, 2025, 7:08:34 PMMay 19
to ccppbrasil
É comum encontrar opiniões dizendo que não é preciso tratar falhas de memória em programas desktop, argumentando que se isto ocorrer o sistema já esta comprometido então é melhor o software fechar.

Faz sentido isso?

(eu vou justificar depois, mas minha opinião eh que sim e depende de cada caso.)

Fabrício Cabral

unread,
May 19, 2025, 9:04:36 PMMay 19
to ccppb...@googlegroups.com
Thiago,

Por que apenas em programas desktop? Vamos estender para todos os casos...

Eu NUNCA tratei em algum programa falha de alocação de memória. Se não retornar a memória alocada, o que fazer? Liberar em algum lugar? Onde?

Mas como você disse, cada caso é um caso. Eu não sei como é isso em sistemas embarcados. Deve fazer sentido nesse ambiente, né?

At.te.

--
http://ccppbrasil.github.io/
https://twitter.com/ccppbrasil
 
[&] C & C++ Brasil - http://www.ccppbrasil.org/
Para sair dessa lista, envie um e-mail para ccppbrasil-...@googlegroups.com
---
Você recebeu essa mensagem porque está inscrito no grupo "ccppbrasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para ccppbrasil+...@googlegroups.com.
Para ver esta conversa, acesse https://groups.google.com/d/msgid/ccppbrasil/3490552a-e7ab-4284-9949-5527a84b79a0n%40googlegroups.com.


--
--fx

Clayton Alves

unread,
May 20, 2025, 7:55:07 AMMay 20
to ccppb...@googlegroups.com
Quais falhas vc se refere ? Falha na alocação (memória indisponível)? Buffer overrun ? Use after free ? Double free ?



--

Thiago Adams

unread,
May 20, 2025, 8:07:49 AMMay 20
to ccppb...@googlegroups.com


On Tue, 20 May 2025 at 08:55, Clayton Alves <clayt...@gmail.com> wrote:
Quais falhas vc se refere ? Falha na alocação (memória indisponível)? Buffer overrun ? Use after free ? Double free ?



Desculpa, o título deveria ser
"Devo tratar a falha por falta de memória?"

Josué Andrade Gomes

unread,
May 20, 2025, 8:32:48 AMMay 20
to ccppb...@googlegroups.com
Deve tratar e fechar o seu programa graciosamente.
A alternativa é: receber um ponteiro nulo (ou inválido), tentar acessar e o SO derrubar o seu programa.

Qual a experiência que você quer para o seu usuário?

--
http://ccppbrasil.github.io/
https://twitter.com/ccppbrasil
 
[&] C & C++ Brasil - http://www.ccppbrasil.org/
Para sair dessa lista, envie um e-mail para ccppbrasil-...@googlegroups.com
---
Você recebeu essa mensagem porque está inscrito no grupo "ccppbrasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para ccppbrasil+...@googlegroups.com.

Thiago Adams

unread,
May 20, 2025, 8:41:13 AMMay 20
to ccppb...@googlegroups.com


On Tue, 20 May 2025 at 09:32, Josué Andrade Gomes <josue...@gmail.com> wrote:
Deve tratar e fechar o seu programa graciosamente.
A alternativa é: receber um ponteiro nulo (ou inválido), tentar acessar e o SO derrubar o seu programa.

Qual a experiência que você quer para o seu usuário?



Pois é, muitas pessoas têm esta ideia.
Um dos argumentos é que se ele você não tiver memória para alocar
um objeto pequeno, tudo já está comprometido.

Só que às vezes os objetos pequenos fazem parte de um objeto maior,
por exemplo um objeto um milhão de objetos "node" dentro um XML.

O usuário poderia estar abrindo um XML gigante. A experiencia
que eu quero  seria a mensagem "Não foi possível abrir este arquivo devido a falta de memória".
e não fechar o programa.







Bruno Sanches

unread,
May 20, 2025, 8:51:27 AMMay 20
to ccppb...@googlegroups.com
Eu a princípio trato com o try catch que engloba tudo e finaliza o programa.

Pois "tratar" tem duas interpretações:

Vou simplesmente detectar, dar uma mensagem de erro e fechar o programa? Talvez eu queira interceptar o erro para tentar salvar algo e evitar que o usuário perca dados?

Ou em algum caso raro se eu pegar um erro de falta de memória tem algo que eu possa fazer para tentar liberar memória e tentar nova alocação? Exceto nesse caso, se acabou a memória, não tem muito o que fazer a não ser finalizar o programa.

Bruno Sanches
========================
https://github.com/bcsanches



--
http://ccppbrasil.github.io/
https://twitter.com/ccppbrasil
 
[&] C & C++ Brasil - http://www.ccppbrasil.org/
Para sair dessa lista, envie um e-mail para ccppbrasil-...@googlegroups.com
---
Você recebeu essa mensagem porque está inscrito no grupo "ccppbrasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para ccppbrasil+...@googlegroups.com.

Josué Andrade Gomes

unread,
May 20, 2025, 8:52:20 AMMay 20
to ccppb...@googlegroups.com
Usando o exemplo do arquivo XML, você poderia:

1. Se antecipar e checar o tamanho do arquivo e nem abrir se o tamanho for muito grande (eg, maior que memória virtual disponível).
2. Você realmente precisa ter todos os nós na memória? Se não, pode ler o arquivo aos poucos e ir descartando o que já foi lido (google por XML streaming)



Em ter., 20 de mai. de 2025 às 09:41, Thiago Adams <thiago...@gmail.com> escreveu:
--
http://ccppbrasil.github.io/
https://twitter.com/ccppbrasil
 
[&] C & C++ Brasil - http://www.ccppbrasil.org/
Para sair dessa lista, envie um e-mail para ccppbrasil-...@googlegroups.com
---
Você recebeu essa mensagem porque está inscrito no grupo "ccppbrasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para ccppbrasil+...@googlegroups.com.

Thiago Adams

unread,
May 20, 2025, 8:54:20 AMMay 20
to ccppb...@googlegroups.com


On Tue, 20 May 2025 at 09:52, Josué Andrade Gomes <josue...@gmail.com> wrote:
Usando o exemplo do arquivo XML, você poderia:

1. Se antecipar e checar o tamanho do arquivo e nem abrir se o tamanho for muito grande (eg, maior que memória virtual disponível).
2. Você realmente precisa ter todos os nós na memória? Se não, pode ler o arquivo aos poucos e ir descartando o que já foi lido (google por XML streaming)



Indiretamente você está tratando neste caso.
Mas a memória dinâmica (como o nome diz) pode falhar depois que você fizer o teste.


Roberto Spadim

unread,
May 20, 2025, 8:59:56 AMMay 20
to ccppb...@googlegroups.com
no final cai em atender requisitos, se precisar atender, tem que estar escrito como tratar, se não só fecha fim cabou

dados grandes dificilmente vejo alguem se preocupando com esse tratamento, acabam indo pra um script py/R que vai processar os dados e moer em seguida, se acabar memoria vai procurar uma lib específica que consegue trata casos de "bigdata" (dado maior q a memoria ram), a pergunta antes disso tudo é oq o seu sistema precisa fazer? depois vc ve como tratar

--
http://ccppbrasil.github.io/
https://twitter.com/ccppbrasil
 
[&] C & C++ Brasil - http://www.ccppbrasil.org/
Para sair dessa lista, envie um e-mail para ccppbrasil-...@googlegroups.com
---
Você recebeu essa mensagem porque está inscrito no grupo "ccppbrasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para ccppbrasil+...@googlegroups.com.


--
Roberto Spadim
SPAEmpresarial

Fabrício Cabral

unread,
May 20, 2025, 9:00:42 AMMay 20
to ccppb...@googlegroups.com
Dúvida de noob mesmo: se eu der um malloc ou new e ele não tiver memória suficiente para alocar, ele já libera a memória da tentativa de alocar ou eu ainda preciso liberar "o que deu para alocar"?

Lembrei de uma coisinha interessante que eu vi há muitos anos, no código do WindowMaker: o Kojima (autor do WindowMaker) fez um wrapper para o malloc para tentar alocar memória e, caso não
conseguisse, esperava 1s e tentava de novo. Acho que esse "1s" era para ver se alguma coisa era liberada, né?

At.te.



--
--fx

Thiago Adams

unread,
May 20, 2025, 9:15:48 AMMay 20
to ccppbrasil
On Tuesday, May 20, 2025 at 10:00:42 AM UTC-3 fabri...@gmail.com wrote:
Dúvida de noob mesmo: se eu der um malloc ou new e ele não tiver memória suficiente para alocar, ele já libera a memória da tentativa de alocar ou eu ainda preciso liberar "o que deu para alocar"?


Se nao tiver memoria o malloc nao vai ter allocado nada e nao precisa liberar nada.
Já o new... se falta memoria no meio da construcao de um objeto ele faz "undo", ou seja, chama dtor,  de todos os objetos
construidos até aquele momento e libera memoria.

 
Lembrei de uma coisinha interessante que eu vi há muitos anos, no código do WindowMaker: o Kojima (autor do WindowMaker) fez um wrapper para o malloc para tentar alocar memória e, caso não
conseguisse, esperava 1s e tentava de novo. Acho que esse "1s" era para ver se alguma coisa era liberada, né?





poderia ocorrer algo assim.
 

Bruno Sanches

unread,
May 20, 2025, 9:17:49 AMMay 20
to ccppb...@googlegroups.com
O único caso que lembro de tratar erro de memória era um jogo que trabalhei para ps2. Como a gente fazia streaming tinha cache de muita coisa e como tínhamos um gerenciador próprio, que "conversava" com esses módulos, se ele não conseguia memória, pedia para o cache dar uma limpada e tentar de novo. Se na segunda tentativa não ia, fim....


Bruno Sanches
========================
https://github.com/bcsanches


Felipe Magno de Almeida

unread,
May 20, 2025, 9:22:35 AMMay 20
to ccppb...@googlegroups.com
Olá Thiago,

Na *maioria* das vezes essa é a forma que eu trato erros de lógica, geralmente usando asserts para coisas que deveriam ser impossíveis. Porém, olhando as próximas mensagens acho que você está falando de falta de memória. Nesse caso, tenho duas abordagens: Uma em Linux outra em Windows.

Linux não-embarcado faz overcommit de memória, e então ele quase nunca falha (falha se você pedir uma quantidade absurda de memória porém, mas daí é um erro de lógica), mas você obtém um segfault. Nesse caso, até o teste da função acaba sendo um pouco useless. No Windows, ele não faz overcommit, daí eu testo e falho a operação por falta de memória, utilizando exceptions de forma standard mesmo.

Porém, consigo compreender onde tentar continuar pode ser mais importante, ou que pelo menos o programa tente gravar algum tipo de estado da aplicação para que o usuário não perca tudo.

Abraços,

On Mon, May 19, 2025 at 8:08 PM Thiago Adams <thiago...@gmail.com> wrote:
--
http://ccppbrasil.github.io/
https://twitter.com/ccppbrasil
 
[&] C & C++ Brasil - http://www.ccppbrasil.org/
Para sair dessa lista, envie um e-mail para ccppbrasil-...@googlegroups.com
---
Você recebeu essa mensagem porque está inscrito no grupo "ccppbrasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para ccppbrasil+...@googlegroups.com.


--
Felipe Magno de Almeida
Owner @ Expertise Solutions
www: https://expertise.dev
phone: +55 48 9 9681.0157
LinkedIn: in/felipealmeida

Roberto Spadim

unread,
May 20, 2025, 9:23:41 AMMay 20
to ccppb...@googlegroups.com
assert dependendo da otimização te deixa maluco



--
Roberto Spadim
SPAEmpresarial

Felipe Magno de Almeida

unread,
May 20, 2025, 9:24:54 AMMay 20
to ccppb...@googlegroups.com
Bom dia Roberto,

On Tue, May 20, 2025 at 10:23 AM Roberto Spadim <rob...@spadim.com.br> wrote:
assert dependendo da otimização te deixa maluco

De que forma?
 

Roberto Spadim

unread,
May 20, 2025, 9:29:13 AMMay 20
to ccppb...@googlegroups.com
tem otimizaçao que tira assert do codigo final

--
http://ccppbrasil.github.io/
https://twitter.com/ccppbrasil
 
[&] C & C++ Brasil - http://www.ccppbrasil.org/
Para sair dessa lista, envie um e-mail para ccppbrasil-...@googlegroups.com
---
Você recebeu essa mensagem porque está inscrito no grupo "ccppbrasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para ccppbrasil+...@googlegroups.com.


--
Roberto Spadim
SPAEmpresarial

Bruno Sanches

unread,
May 20, 2025, 9:37:53 AMMay 20
to ccppb...@googlegroups.com
Como o devkit do ps2 me deixava maluco, pois você só conseguia depurar o código nele, mas ele tinha muito mais ram do que o ps2, então seu jogo não dava pau de memória nele. Dai você queimava o CD, colocava no ps2 e bum... tela preta....

resolvi o problema com uma função bem alegre e simples:
void fuck()
{
     for(int i = 0;i < 32; ++i)
            malloc(1024 * 1024);
}

E na main tinha um #ifdef se era o dev kit, alocava memoria igual um retardado para ficar igual. Sim, a função chamava fuck.


Bruno Sanches
========================
https://github.com/bcsanches


Thiago Adams

unread,
May 20, 2025, 9:53:04 AMMay 20
to ccppb...@googlegroups.com


On Tue, 20 May 2025 at 10:37, Bruno Sanches <bcsa...@gmail.com> wrote:
Como o devkit do ps2 me deixava maluco, pois você só conseguia depurar o código nele, mas ele tinha muito mais ram do que o ps2, então seu jogo não dava pau de memória nele. Dai você queimava o CD, colocava no ps2 e bum... tela preta....

resolvi o problema com uma função bem alegre e simples:
void fuck()
{
     for(int i = 0;i < 32; ++i)
            malloc(1024 * 1024);
}

E na main tinha um #ifdef se era o dev kit, alocava memoria igual um retardado para ficar igual. Sim, a função chamava fuck.



Uma vez eu desenvolvi no desktop um programa que iria rodar no arduino.
Então, o que eu fiz foi emular a alocação de memória e fragmentação do arduino no desktop implementado a malloc e free.
Não era 100% perfeita a emulação (pois o stack não entrava na jogada) mas seria para manter o programa dentro de limite de
memória e ainda simular fragmentação.



Bruno Sanches

unread,
May 20, 2025, 10:06:20 AMMay 20
to ccppb...@googlegroups.com
E o que matava a gente no console era justamente a fragmentação.

hoje eu fiz aqui no meu projetinho em casa um "emulador" para rodar o código arduino no PC, na verdade é só um wrapper em cima das chamadas do arduino que uso e assim consigo dar build no codigo arduino e rodar no desktop, facilita muito a vida ter um debugger e da até para fazer uns unit tests. Salva boas horas de print no arduino caçando erros

Bruno Sanches
========================
https://github.com/bcsanches


--
http://ccppbrasil.github.io/
https://twitter.com/ccppbrasil
 
[&] C & C++ Brasil - http://www.ccppbrasil.org/
Para sair dessa lista, envie um e-mail para ccppbrasil-...@googlegroups.com
---
Você recebeu essa mensagem porque está inscrito no grupo "ccppbrasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para ccppbrasil+...@googlegroups.com.

Felipe Magno de Almeida

unread,
May 20, 2025, 10:24:35 AMMay 20
to ccppb...@googlegroups.com
Bom dia Roberto,

On Tue, May 20, 2025 at 10:29 AM Roberto Spadim <rob...@spadim.com.br> wrote:
tem otimizaçao que tira assert do codigo final

Sim. Mas como isso deixa maluco?
 

Felipe Magno de Almeida

unread,
May 20, 2025, 10:26:44 AMMay 20
to ccppb...@googlegroups.com
Bom dia Bruno,

On Tue, May 20, 2025 at 10:37 AM Bruno Sanches <bcsa...@gmail.com> wrote:
Como o devkit do ps2 me deixava maluco, pois você só conseguia depurar o código nele, mas ele tinha muito mais ram do que o ps2, então seu jogo não dava pau de memória nele. Dai você queimava o CD, colocava no ps2 e bum... tela preta....

resolvi o problema com uma função bem alegre e simples:
void fuck()
{
     for(int i = 0;i < 32; ++i)
            malloc(1024 * 1024);
}

E na main tinha um #ifdef se era o dev kit, alocava memoria igual um retardado para ficar igual. Sim, a função chamava fuck.

Ótima forma de tentar simular o mesmo ambiente. Parabéns. (Não estou sendo sarcástico, realmente achei ingenious)
 

Bruno Sanches
========================
https://github.com/bcsanches

Roberto Spadim

unread,
May 20, 2025, 11:27:26 AMMay 20
to ccppb...@googlegroups.com
o assert virar parte do codigo e vc nao perceber

--
http://ccppbrasil.github.io/
https://twitter.com/ccppbrasil
 
[&] C & C++ Brasil - http://www.ccppbrasil.org/
Para sair dessa lista, envie um e-mail para ccppbrasil-...@googlegroups.com
---
Você recebeu essa mensagem porque está inscrito no grupo "ccppbrasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para ccppbrasil+...@googlegroups.com.


--
Roberto Spadim
SPAEmpresarial

Bruno Sanches

unread,
May 20, 2025, 12:12:45 PMMay 20
to ccppb...@googlegroups.com
Bom dia!

Bom, resolveu nosso problema e me fez ter mais noites para poder dormir :P

Att
Bruno Sanches
========================
https://github.com/bcsanches


--
http://ccppbrasil.github.io/
https://twitter.com/ccppbrasil
 
[&] C & C++ Brasil - http://www.ccppbrasil.org/
Para sair dessa lista, envie um e-mail para ccppbrasil-...@googlegroups.com
---
Você recebeu essa mensagem porque está inscrito no grupo "ccppbrasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para ccppbrasil+...@googlegroups.com.

Roberto Spadim

unread,
May 21, 2025, 8:54:26 AMMay 21
to ccppb...@googlegroups.com
Se quiser tratar ok, capaz do sistema operacional morrer antes 


--
http://ccppbrasil.github.io/
https://twitter.com/ccppbrasil
 
[&] C & C++ Brasil - http://www.ccppbrasil.org/
Para sair dessa lista, envie um e-mail para ccppbrasil-...@googlegroups.com
---
Você recebeu essa mensagem porque está inscrito no grupo "ccppbrasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para ccppbrasil+...@googlegroups.com.

Joilnen Leite

unread,
May 21, 2025, 11:05:22 AMMay 21
to ccppb...@googlegroups.com
sim vc deve tratar, no contexto de c++ sugiro usar smartpointers.

Bruno Sanches

unread,
May 21, 2025, 11:16:16 AMMay 21
to ccppb...@googlegroups.com
MAs o smartpointer não vai tratar falha de memória ou falta de memória...

Bruno Sanches
========================
https://github.com/bcsanches


Joilnen Leite

unread,
May 21, 2025, 12:26:27 PMMay 21
to ccppb...@googlegroups.com
Irá evitar as falhas por falta de liberação, e atualmente é padrão de alocação em C++

Bruno Sanches

unread,
May 21, 2025, 4:03:58 PMMay 21
to ccppb...@googlegroups.com
Sim, mas a pergunta é tratar se new retornar null ou der throw por falta de memória, isso não tem smartpointer que resolva
Bruno Sanches
========================
https://github.com/bcsanches


Fabio A Mazzarino

unread,
May 22, 2025, 8:01:30 AMMay 22
to ccppb...@googlegroups.com
Desculpe o atraso, estive offline por um tempo.

Mas vamos à sua pergunta. Pelo que eu entendi, vc gostaria de saber se vc deveria tratar falha de alocação de memória.

A resposta em uma única frase: Depende.

CASO A CASO

Se vc está fazendo algo Quick'n Dirty, não. Dificilmente vc vai ter problemas, e se tiver, ninguém liga, é só deixar claro que é Quick'n Dirty.

Se vc está desenvolvendo um sistema embarcado, com certeza. Existe a possibilidade real de faltar memória, e se não tiver esse tratamento seu programa tem boas chances de falhar sem deixar rastros.

Se vc está desenvolvendo para desktop ou servidor, depende de novo.

Se o público alvo do programa para servidor/desktop for relativamente pequeno, possivelmente não, somente para clientes internos, ou poucos clientes. Caso aconteça uma falha desse tipo, vc vai poder avaliar se de fato o sistema já estava corrompido, ou se foi vc quem corrompeu o sistema. É possível tratar o raríssimo caso de falhas de alocação caso a caso.

Se o pública for grande, como um software de prateleira, por exemplo, ou uma base de usuários muito grande espalhada por centenas ou milhares de sites, ou ao redor do mundo, com certeza. Vc precisa tratar essa falha também para gerar mensagens de erro e evidências do que aconteceu, para assim poder dar suporte às raras falhas desse tipo. 

SIMPLIFICANDO
1. Quick'n Dirty - não precisa
2. Sistemas Embarcados - com certeza
3. Desktop/Servidor base de usuários restrita - opcional, mas facilita o suporte
4. Desktop/Servidor ampla base de usuários - com certeza

EM RESUMO
O problema de fato com limitações de memória ocorre apenas em sistemas embarcados, quando a possibilidade de não haver memória suficiente é real.

Nos demais, normalmente a memória está amplamente disponível, e uma falha dessa torna-se rara. Nesses casos, a validação vira uma questão de suporte, em sistemas que não precisam de suporte, conforme o sistema fica maior, mais crítico, e com uma base maior de usuários, é recomendado gerar tratamento de erro apropriado, mais no sentido de gerar evidências de falhas, que de fato manter o sistema funcionando.

COMO FAZER?
Ah, aí é outra história. Vc perguntou só sobre se deve ou não.



Lab C++ - Código, Dicas e Snippets

Fabrício Cabral

unread,
May 22, 2025, 8:39:02 AMMay 22
to ccppb...@googlegroups.com
Fabio,

Então pergunto eu: como fazer? :)

At.te.



--
--fx

angelo

unread,
May 22, 2025, 10:18:46 AMMay 22
to ccppb...@googlegroups.com
bom dia, 
Poxa, eu aprendi que, aliás todo mundo aqui deve ter aprendido em algum momento, em tese, todo software deveria ser algo  "a prova de usuários" ou seja, não falhar, não errar. (pelo menos na teoria)
Ainda mais se for um bem crítico. Esse precisaria estar bem coberto

Se a batata ou o servidor onde ele vai rodar, não tá bom aí já seriam  outros 500..  me refiro a um possivel hardware ruim (causando erros aleatorios, coisa do tipo)

então, porque não tratar o erro ? eu hein.. kkk


Roberto Spadim

unread,
May 22, 2025, 10:39:03 AMMay 22
to ccppb...@googlegroups.com
software deveria ser feito em cima de requisitos, se nao é pra tratar erro, não trate, se é pra tratar, trate.



--
Roberto Spadim
SPAEmpresarial

Bruno Sanches

unread,
May 22, 2025, 11:32:09 AMMay 22
to ccppb...@googlegroups.com
Então, mas cai no que comentei em outro email, vocÊ vai tratar erro de memória e fazer o que?

No maximo dar uma mensagem de erro bonitinha e tentar salvar algo.... fora isso...

Bruno Sanches
========================
https://github.com/bcsanches


Em qui., 22 de mai. de 2025 às 11:18, angelo <angelo...@gmail.com> escreveu:

angelo

unread,
May 22, 2025, 11:45:23 AMMay 22
to ccppb...@googlegroups.com
fico pensando..
o pessoal mais novinho que só viu web, que nunca fez nada desktop, algo mais "compilável", rodar uns .exe digamos assim... me refiro aos colegas do front-end / backend

Essas da linguagem alto nível, scripts no caso da web, não tem nem como tratar erro de memória direito..  na verdade estão terceirizados dependendo da plataforma que o executa ( o servidor web);  se bem que backend ainda compila alguma coisa. ( C#, asp.net,  java..c++, bla bla por aí vai)


Thiago Adams

unread,
May 22, 2025, 11:52:58 AMMay 22
to ccppbrasil
On Thursday, May 22, 2025 at 12:32:09 PM UTC-3 Bruno Sanches wrote:
Então, mas cai no que comentei em outro email, vocÊ vai tratar erro de memória e fazer o que?


Continua.
Por exemplo, naquele exemplo que dei que não tinha memória
para um XML em memória. Se deu erro, ele libera o que já tinha alocado e "segue o baile".


Bruno Sanches

unread,
May 22, 2025, 11:54:15 AMMay 22
to ccppb...@googlegroups.com
Olha, é complicado viu.

Andei lidando com alguns aqui, turma não tem noção de nada....da mesma forma que web é tudo script rodando numa VM, eles também praticamente vivem numa VM...

Bruno Sanches
========================
https://github.com/bcsanches


Bruno Sanches

unread,
May 22, 2025, 11:55:21 AMMay 22
to ccppb...@googlegroups.com
Sim sim, mas é situação bem específica, maioria dos programas se acabou a memória, acabou o mundo...e tirando embarcados, ao meu ver tanto windows quanto linux, se ele nao lhe entregou memória, o computador já vai estar morrendo....



--
http://ccppbrasil.github.io/
https://twitter.com/ccppbrasil
 
[&] C & C++ Brasil - http://www.ccppbrasil.org/
Para sair dessa lista, envie um e-mail para ccppbrasil-...@googlegroups.com
---
Você recebeu essa mensagem porque está inscrito no grupo "ccppbrasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para ccppbrasil+...@googlegroups.com.

de...@roo.com.br

unread,
May 23, 2025, 10:59:57 AMMay 23
to ccppbrasil
uma coisa eh certa;

google chrome e o firefox - crasha mas nao trata memoria

tratar ou nao vai depender do proposito do app, necessidade e orcamento...

Joilnen Leite

unread,
May 23, 2025, 4:01:54 PMMay 23
to ccppb...@googlegroups.com
O contexto foi "É comum encontrar opiniões dizendo que não é preciso tratar falhas de memória em programas desktop, argumentando que se isto ocorrer o sistema já está comprometido então é melhor o software fechar."
A pessoa procura saber se vale a pena tratar falhas de memória, o uso de smartpointers irá ajudá-lo a não ter falhas, de duplo free, de nao free, e o é ideal pra se fazer o gerenciamento de memória no C++ moderno, então na minha opinião se aplica sim.

Joilnen Leite

unread,
May 23, 2025, 4:08:19 PMMay 23
to ccppb...@googlegroups.com
Acredito q o melhor é numa falha de memória, codificar uma saída limpando o que puder, pq em pouco tempo o sistema, vai dar um crash ou coredump, no windows, coisas pior, agora se vc fala numa falha de alocação de memória é outra coisa, então vc codifica outras formas alternativas de estrutura de dados para suprir isto.

Fabio A Mazzarino

unread,
May 29, 2025, 8:22:16 AMMay 29
to ccppb...@googlegroups.com
Fabrício:

Aí tem várias outras formas, e depende da disponibilidade de recursos tb.

1. Code review manual
2. Análise estática automática
3. Memory logger

MANUAL
Este é o mais problemático, e tem mais chance de dar ruim. Vc coloca code review por um ou mais pares verificando se há ou não vazamento de memória.

Consome mais tempo de desenvolvimento, mas não precisa de muitos recursos

AUTOMÁTICA
Esse resolve grande parte dos problemas, e vc ainda ganha na qualidade geral de código. 

A análise estática automatizada vai detectar vários tipos de vazamento de memória, mas deixa passar vários tb. 

A grande vantagem é não ter custo de tempo de desenvolvimento, mas precisa ser implantado e preferencialmente automatizado.

MEMORY LOGGER
Esse é o mais top, e funciona muito bem, mas consome processamento e memória.

TODA alocação e desalocação de memória precisa ser feita através de funções/métodos específicos que vai anotar, em memória, a situação de cada alocação. E no final da execução, caso haja vazamento de memória, um log de vazamento é gerado, indicando, inclusive, arquivo e linha da alocação, dependendo, claro, da forma com que é implementado.

Durante os testes, unitários e integrados, o programa deve ser finalizado, e verificado se há log de vazamento de memória.

Já vi esse método sendo utilizado, e é muito top.

CONECTANDO COM O POST ANTERIOR
Considerando ser essencial o controle de vazamento de memória:

1. Quick'n Dirty - MANUAL 
2. Sistemas Embarcados incapaz de aguentar o logger - MANUAL + AUTOMÁTICA
3. Sistemas Embarcados capaz de aguentar o logger - AUTOMÁTICA + LOGGER 
4. Desktop - AUTOMÁTICA + LOGGER, sendo logger opcional
5. Servicor - AUTOMÁTICA + LOGGER

MINHA RECOMENDAÇÃO
Se não for Quick'n Dirty, utilize NO MÍNIMO a análise estática de código. O ganho vale muito a pena, e não somente em vazamento de memória.

Se for um projeto para desktop, verifique se o tamanho da base de usuários justifica um logger.

Se for um projeto para servidor, considere seriamente criar um logger. Em especial pq o servidor precisa ficar ligado por dias, semanas ou meses.

Sempre que possível adicione análise estática automática no seu pipeline, de preferência acionado durante o commit, assim vc tem ganho não somente no vazamento de memória, mas tb na qualidade geral do código.

Ficou alguma dúvida?


--
Lab C++ - Código, Dicas e Snippets

Fabio A Mazzarino

unread,
May 29, 2025, 8:25:31 AMMay 29
to ccppb...@googlegroups.com
Exatamente.

Vc vai avisar o usuário/suporte/administrador que está de fato faltando memória, e que o sistema não está o suficiente.

Então o usuário/suporte/administrador pode, dentro das suas capacidades, avaliar se o sistema está instável ou se está faltando memória e tomar uma ação reativa.

É melhor avisar, que deixar todo mundo no escuro.


Lab C++ - Código, Dicas e Snippets

Bruno Sanches

unread,
May 29, 2025, 9:05:59 AMMay 29
to ccppb...@googlegroups.com
Eu usei muito memory logger quando trabalhava com jogos. Na verdade eu peguei um jogo na fase final e fiquei mais de mês só limpando memory leak (época que smart pointer ainda era tabu)

Basicamente eram macros em cima de new, delete, cada alocação a gente jogava numa lista, anotando a linha e arquivo de código onde foi feito, além do endereço que foi alocado e no delete removia da lista. No final gerava um arquivo de log com o que sobrava na lista. A partir deste ponto era ir checando as alocações e pq não foi liberado.

Isso só rodava nas versões debug e de teste, versões release os macros iam para os new e delete padrão.

Att

Bruno Sanches
========================
https://github.com/bcsanches


Fabrício Cabral

unread,
May 29, 2025, 10:14:11 AMMay 29
to ccppb...@googlegroups.com
Muito bom, Fabio! Obrigado!

At.te.



--
--fx

Fabio A Mazzarino

unread,
May 29, 2025, 12:16:31 PMMay 29
to ccppb...@googlegroups.com
Antes Tardis doq nunca.


Lab C++ - Código, Dicas e Snippets

angelo

unread,
May 31, 2025, 5:57:00 PMMay 31
to ccppb...@googlegroups.com
Ainda pouco soube através de uma outra lista que assino, de um incidente ocorrido, relatando uma queda de uma base de dados Oracle em ambiente de produção. O e-mail já veio com o assunto  "Memory error and database crash"  
É um exemplo real do que foi discutido aqui nos últimos dias..

Pense no transtorno que é um banco de dados fora do ar, crítico para os negócios, no meio do expediente..
O cara colou um print com os logs gerados, que entendo que seriam para acionar o suporte depois ou tentar resolver o problema com a equipe dele
Colei só um pedacinho aqui abaixo pra ilustrar, realmente, esse exemplo real o Oracle tratou o erro, gravou logs e encerrou o sistema.

"ORA-04031: unable to allocate 56 bytes of shared memory ("shared pool","unknown object","KKSSP^2636","kglseshtSegs")
[TOC00001-END]
[TOC00002]
========= Dump for incident 2395522 (ORA 4031) ========
[TOC00003]
----- Beginning of Customized Incident Dump(s) -----
*** 2025-05-29T21:02:49.270543-04:00
=================================
....Begin 4031 Diagnostic Information
The following information assists Oracle in diagnosing
causes of ORA-4031 errors. This trace may be disabled
....
"



Joilnen Leite

unread,
May 31, 2025, 6:05:46 PMMay 31
to ccppb...@googlegroups.com

É o tratento q é possível, recolher o maior Numero de informaçōes, Johar num arquivo log e encerrar tentando desalocar o q ainda estiver alocado.


Reply all
Reply to author
Forward
0 new messages