--
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 essa discussão na Web, acesse https://groups.google.com/d/msgid/ccppbrasil/CAMdN80Q%3DOftMxee1y9EXNjuu-A-8i%3DALCv3UenCmY55N8YUZZw%40mail.gmail.com.
--
--
Para ver essa discussão na Web, acesse https://groups.google.com/d/msgid/ccppbrasil/CACOovBB7xaNaLAfp7wFpM7XJUZvpSWM%2BfpyNstRE9jdm8%2BJBDg%40mail.gmail.com.
Para ver essa discussão na Web, acesse https://groups.google.com/d/msgid/ccppbrasil/CAKG6imd6qBcsoxiByvZAU3wBu1koMXvNEw6oefRGk%2B62%2BTppEA%40mail.gmail.com.
Memória livre disponível
Uma função extremamente útil disponível no C++ Builder, é CoreLeft ( ), e que dá a memória heap disponível. Uma surpresa é perceber que ela é uma função da Borland e não do C ou do C++. Depois de perceber que não havia tal função no excelente G++, da GNU, e uma boa olhada nos FAQs da Internet, tirei o tempo necessário para fazer uma versão razoável de CoreLeft, que me ajudou em muito a resolver um problema de vazamento de memória, e que, para piorar, desaguava na fatídica mensagem “dead”, do Linux na distribuição Debian (mensagem que lembra um pouco os contos do grande Edgar Allan Poe, em especial o Rei Peste). Digressões à parte segue o código, o bastante pequeno para ser digitado:
long CoreLeft( ) {
register long Conta=31, OK=0, Temp; // e1
long *P; // e2
for(; Conta >= 0; Conta --) { // e3
try { // e4
Temp = (OK | (1 << Conta)); // e5
P = new long[Temp]; // e6
} // fim try
catch(...) {continue; } // e7
OK = Temp; // e8
delete [ ] P; // e9
} // fim for
return sizeof(long) * OK; // e10
}
Onde: e1 - pede para alocar variáveis em register da CPU, para maximizar o desempenho. Se o compilador conseguir, fornece, senão põe em memória; e2 - alocar array de long é uma boa estratégia, por ter quatro bytes.
Depois: e3 - inicia pelo bit mais significativo, com Conta em 31, decrescente; e4 inicia o bloco try onde está a chamada para alocar memória dinâmica, via operador new, que arremessa bad_alloc se não conseguir a quantidade pedida; e5 é a fórmula mágica. OK inicia com zero mas vai compondo 1, ou não, a partir da posição mais alta. No primeiro passo é tudo zero. No segundo pode ter, ou não, 1 na posição mais significativa e o restante são zeros. A cada passo do laço de repetição inclui, ou não, através do Ou bit a bit, o 1 deslocado de Conta (algo na forma, para 4 bits: se conseguiu 8, tenta 8 + 4; senão tenta 4; no passo seguinte tenta incluir o bit que representa o 2; assim, com quatro bits pode conseguir 15. Com 32 bits pode chegar a 4 GBytes);
Ainda: e6 - tenta alocar o array de Temp longs; e7 - se não conseguir o catch all captura o objeto, e salta e8 e e9; se conseguir, e8 salva em OK o valor válido que conseguiu alocar de longs; e9 - libera vetor que libera a memória alocada para pedir de novo, maior, no próximo passo.
Ao final, em e10 após o término do for iniciado em e3, OK contém o número de longs que alocou. Basta multiplicar pelo tamanho de long para ter o tamanho em bytes.
Nota: a memória máxima obtida é para criar vector, que pede memória contígua. Se a memória estiver fragmentada o número retornado por CoreLeft representa apenas o maior bloco livre contínuo. Se sua memória for maior que 4GBytes você deve aumentar o valor inicial de Conta, em e1. Para usá-la basta chamar CoreLeft no início e no final de trecho do código onde você tenha alocações e liberações com suspeita de vazamento de memória. Sendo M1 e M2 os valores retornados nos dois pontos: assert(M1 == M2); valida o trecho.
Para ver essa discussão na Web, acesse https://groups.google.com/d/msgid/ccppbrasil/CACVaizRQ%2BJUkmNwOqz-BhPKiFQ%2Boj-LDFyiZ3Sa4tyfkLJ93cw%40mail.gmail.com.
Para ver essa discussão na Web, acesse https://groups.google.com/d/msgid/ccppbrasil/CACOovBAhDSZKo6HLDzcccT-hcmLFO-eaSggWCJMNoTAv3%2BKN%3Dw%40mail.gmail.com.
https://twitter.com/ccppbrasil
[&] C & C++ Brasil - http://www.ccppbrasil.org/
Para sair dessa lista, envie um e-mail para ccppbrasil-...@googlegroups.com
---
Você está recebendo esta mensagem porque se inscreveu 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 discussão na web, acesse https://groups.google.com/d/msgid/ccppbrasil/b978aecb-3eb8-9fd0-a0f6-96c5420b24d1%40gmail.com.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para ccppbrasil+...@googlegroups.com.
Para ver essa discussão na Web, acesse https://groups.google.com/d/msgid/ccppbrasil/CAHSBi4Tyt5AMMLJghziw0q%2Bq39wU5Wo7u-KbFnJnkfahN%2BExaA%40mail.gmail.com.
https://twitter.com/ccppbrasil
[&] C & C++ Brasil - http://www.ccppbrasil.org/
Para sair dessa lista, envie um e-mail para ccppbrasil-...@googlegroups.com
---
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para ccppbrasil+...@googlegroups.com.
Para ver essa discussão na Web, acesse https://groups.google.com/d/msgid/ccppbrasil/CACOovBBT%3DRz%3Dnti3%2BanetDJhs4th0-LkoML5PY1J2HNRWm89mA%40mail.gmail.com.
Para ver essa discussão na Web, acesse https://groups.google.com/d/msgid/ccppbrasil/CACVaizT%2BEUHEyfBqyxTXv1%2Bj4eaYP533jUZQAGnkEB%2BH2CVgLQ%40mail.gmail.com.
https://twitter.com/ccppbrasil
[&] C & C++ Brasil - http://www.ccppbrasil.org/
Para sair dessa lista, envie um e-mail para ccppbrasil-...@googlegroups.com
---
Você está recebendo esta mensagem porque se inscreveu 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 discussão na web, acesse https://groups.google.com/d/msgid/ccppbrasil/1fe40fab-58ed-7b79-c16a-eb50c43071bc%40gmail.com.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para ccppbrasil+...@googlegroups.com.
Para ver essa discussão na Web, acesse https://groups.google.com/d/msgid/ccppbrasil/CACOovBDt8K3NTSHFc1O0W%3DROC-OnWdUpiWgo%3DoCv3TgeWBB2%3Dg%40mail.gmail.com.
Para ver essa discussão na Web, acesse https://groups.google.com/d/msgid/ccppbrasil/CACVaizTk6H4BWQXG5a_dS_D3bDW5ucTpFBPS4X6Z9YLBoCNLuA%40mail.gmail.com.
Para ver essa discussão na Web, acesse https://groups.google.com/d/msgid/ccppbrasil/9ba60ece-46ce-4421-aaff-0832c4c5a305n%40googlegroups.com.
Para ver essa discussão na Web, acesse https://groups.google.com/d/msgid/ccppbrasil/CACOovBC0%3DLdCJUDJncGxJStzg-DU3WA%2Bw_qUw7RGNFYyHE6N0A%40mail.gmail.com.