Memória Utilizada

61 views
Skip to first unread message

Gyell Gonçalves de Matos

unread,
Mar 24, 2021, 10:02:31 AM3/24/21
to ccppb...@googlegroups.com
Bom dia prezados.

Estou com um problema no meu código, pois acho que em algum ponto ele está consumindo mais memória que o necessário.

Existe algo que eu possa fazer, para acompanhar o uso de memória?

Desde já agradeço.

Virgilio Fornazin

unread,
Mar 24, 2021, 10:24:39 AM3/24/21
to ccppb...@googlegroups.com
valgrind

--
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.

Bruno Sanches

unread,
Mar 24, 2021, 11:28:03 AM3/24/21
to ccppb...@googlegroups.com
No visual studio agora ele já vem com uns profilers la que vão mostrando o uso de memória.


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



--

Vilmar Pedro Votre

unread,
Mar 25, 2021, 7:27:07 PM3/25/21
to ccppb...@googlegroups.com
O Borland C++ tinha uma função MemoryLeft que mostrava a memória disponível.
Depois descobri que não era parte do standard. 
Implementei uma versão que me ajudou a depurar vazamentos de memória,

#include <string>
#include <thread>
using namespace std;

long  CoreLeft(short Bits) {
        register long Conta=Bits,  OK=0, Temp=Bits=0;
        long *P = nullptr;
        for(; Conta >= 0; Conta --) {
            try {
                 Temp = (OK | (1 << Conta));
                 P = new long[Temp];
                } // fim try
            catch(...) {continue;  }  // se não conseguir alocar encerra o loop
            OK = Temp;
            delete  [ ] P;  // delete array
            }  // fim for
        return sizeof(long) * OK;
        }
       
        int main ( ) {
        cout << endl <<  "\tMemória livre: " << CoreLeft(31) << "  bytes" << endl;
        cout << endl << "\tTrilhas: " <<  thread ::  hardware_concurrency()  << "  trilhas" <<  endl <<  endl;
         
         return 0;
         } 

De quebra testa o número de trilhas de hardware.

Se for útil bom proveito.

Prof. Vilmar

Em qua., 24 de mar. de 2021 às 11:02, Gyell Gonçalves de Matos <gy...@pq.uenf.br> escreveu:
--

Josue Andrade Gomes

unread,
Mar 26, 2021, 6:01:57 AM3/26/21
to ccppb...@googlegroups.com
Não use essa função em produção porque pode fragmentar a memória.

Na verdade não entendi como essa função opera. Podia esclarecer?
Testei aqui e tive o mesmo valor antes e depois de uma alocação de memória.
Qual o significado do parâmetro Bits?
Outra coisa, o comentário fala "se não conseguir alocar encerra o loop", mas você está usando continue que, bem, continua o loop.



pontilh...@gmail.com

unread,
Mar 26, 2021, 7:41:42 AM3/26/21
to ccppb...@googlegroups.com

Vilmar Pedro Votre

unread,
Mar 26, 2021, 8:27:50 PM3/26/21
to ccppb...@googlegroups.com
Olá Josué.
Já que você se interessou, eu tenho um livro: C++ Explicado e Aplicado, pela AltaBooks, do Rio.

Achei o texto, do livro, que explica a função. Espero que clareie.

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.  



Essa parte de exceção e alocação de memória é chata de aprender. Para memórias maiores precisa fazer upgrade do 31 bits e tipos de variáveis. 

Abraços
    Vilmar  

Message has been deleted

Josue Andrade Gomes

unread,
Mar 28, 2021, 4:54:04 PM3/28/21
to ccppb...@googlegroups.com

Adriano dos Santos Fernandes

unread,
Apr 1, 2021, 3:59:31 PM4/1/21
to ccppb...@googlegroups.com
Eu jogaria esse livro fora após ver isso.


Adriano


On 26/03/2021 21:27, Vilmar Pedro Votre wrote:
> Olá Josué.
> Já que você se interessou, eu tenho um livro: C++ Explicado e Aplicado,
> pela AltaBooks, do Rio.
>
> Achei o texto, do livro, que explica a função. Espero que clareie.
>
> 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.  /
>
>
>
> Essa parte de exceção e alocação de memória é chata de aprender. Para
> memórias maiores precisa fazer upgrade do 31 bits e tipos de variáveis. 
>
> Abraços
>     Vilmar  
>
> Em sex., 26 de mar. de 2021 às 07:01, Josue Andrade Gomes
> <josue...@gmail.com <mailto:josue...@gmail.com>> escreveu:
>
> Não use essa função em produção porque pode fragmentar a memória.
>
> Na verdade não entendi como essa função opera. Podia esclarecer?
> Testei aqui e tive o mesmo valor antes e depois de uma alocação de
> memória.
> Qual o significado do parâmetro Bits?
> Outra coisa, o comentário fala "se não conseguir alocar encerra o
> loop", mas você está usando *continue* que, bem, continua o loop.
>
>
>
> Em qui., 25 de mar. de 2021 às 20:27, Vilmar Pedro Votre
> <vilma...@gmail.com <mailto:vilma...@gmail.com>> escreveu:
> <gy...@pq.uenf.br <mailto:gy...@pq.uenf.br>> escreveu:
>
> Bom dia prezados.
>
> Estou com um problema no meu código, pois acho que em algum
> ponto ele está consumindo mais memória que o necessário.
>
> Existe algo que eu possa fazer, para acompanhar o uso de
> memória?
>
> Desde já agradeço.
>
> --
> http://ccppbrasil.github.io/ <http://ccppbrasil.github.io/>
> https://twitter.com/ccppbrasil <https://twitter.com/ccppbrasil>
>  
> [&] C & C++ Brasil - http://www.ccppbrasil.org/
> <http://www.ccppbrasil.org/>
> Para sair dessa lista, envie um e-mail para
> ccppbrasil-...@googlegroups.com
> <mailto: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
> <mailto:ccppbrasil+...@googlegroups.com>.
> <https://groups.google.com/d/msgid/ccppbrasil/CAMdN80Q%3DOftMxee1y9EXNjuu-A-8i%3DALCv3UenCmY55N8YUZZw%40mail.gmail.com?utm_medium=email&utm_source=footer>.
>
> --
> http://ccppbrasil.github.io/ <http://ccppbrasil.github.io/>
> https://twitter.com/ccppbrasil <https://twitter.com/ccppbrasil>
>  
> [&] C & C++ Brasil - http://www.ccppbrasil.org/
> <http://www.ccppbrasil.org/>
> Para sair dessa lista, envie um e-mail para
> ccppbrasil-...@googlegroups.com
> <mailto: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
> <mailto:ccppbrasil+...@googlegroups.com>.
> Para ver essa discussão na Web, acesse
> https://groups.google.com/d/msgid/ccppbrasil/CACOovBB7xaNaLAfp7wFpM7XJUZvpSWM%2BfpyNstRE9jdm8%2BJBDg%40mail.gmail.com
> <https://groups.google.com/d/msgid/ccppbrasil/CACOovBB7xaNaLAfp7wFpM7XJUZvpSWM%2BfpyNstRE9jdm8%2BJBDg%40mail.gmail.com?utm_medium=email&utm_source=footer>.
>
> --
> http://ccppbrasil.github.io/ <http://ccppbrasil.github.io/>
> https://twitter.com/ccppbrasil <https://twitter.com/ccppbrasil>
>  
> [&] C & C++ Brasil - http://www.ccppbrasil.org/
> <http://www.ccppbrasil.org/>
> Para sair dessa lista, envie um e-mail para
> ccppbrasil-...@googlegroups.com
> <mailto: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
> <mailto:ccppbrasil+...@googlegroups.com>.
> Para ver essa discussão na Web, acesse
> https://groups.google.com/d/msgid/ccppbrasil/CACVaizRQ%2BJUkmNwOqz-BhPKiFQ%2Boj-LDFyiZ3Sa4tyfkLJ93cw%40mail.gmail.com
> <https://groups.google.com/d/msgid/ccppbrasil/CACVaizRQ%2BJUkmNwOqz-BhPKiFQ%2Boj-LDFyiZ3Sa4tyfkLJ93cw%40mail.gmail.com?utm_medium=email&utm_source=footer>.
>
> --
> http://ccppbrasil.github.io/ <http://ccppbrasil.github.io/>
> https://twitter.com/ccppbrasil <https://twitter.com/ccppbrasil>
>  
> [&] C & C++ Brasil - http://www.ccppbrasil.org/ <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
> <mailto:ccppbrasil+...@googlegroups.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://groups.google.com/d/msgid/ccppbrasil/CACOovBAhDSZKo6HLDzcccT-hcmLFO-eaSggWCJMNoTAv3%2BKN%3Dw%40mail.gmail.com?utm_medium=email&utm_source=footer>.

Filipe Mulonde

unread,
Apr 1, 2021, 6:16:04 PM4/1/21
to ccppb...@googlegroups.com
O que eu deve fazer para sair do grupo ?

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.

André Tupinambá

unread,
Apr 1, 2021, 6:21:44 PM4/1/21
to C/C++ Brasil
Como escrito no rodapé de TODAS as mensagens do grupo...

[&] 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/CAHSBi4Tyt5AMMLJghziw0q%2Bq39wU5Wo7u-KbFnJnkfahN%2BExaA%40mail.gmail.com.

Vilmar Pedro Votre

unread,
Apr 1, 2021, 7:28:32 PM4/1/21
to ccppb...@googlegroups.com
Olá Adriano

Se você tem um trecho de programa que aloca, usa e depois libera memória o uso de CoreLeft que sugeri é:
  - pergunta memória livre antes do trecho;
 - pergunta pela memória livre após ter liberado.
O assert checa se o valor é o mesmo, que é o esperado.
De fato é bom tirar o teste do ambiente de produção.

O código que usei se baseia no algoritmo de conversão de analógico para digital necessário nos computadores que
controlam processos, por exemplo. 
A conversão de digital para analógico é muito mais simples.

Incluí o uso de exceção do C++ um item não trivial de aprender e extremamente útil. 

Meu livro tem 700 páginas e quem o lê e usa tem gostado. 

Eu já joguei muitos livros fora, mas não jogaria o meu.

Desafio você a melhorar alguma parte dele. Estou precisando complementá-lo em cima das melhorias posteriores a c++11.   Topo discutir estes novos assuntos.

Atenciosamente
   Prof. Vilmar

  

Para sair dessa lista, envie um e-mail para ccppbrasil-...@googlegroups.com
---

Josue Andrade Gomes

unread,
Apr 1, 2021, 7:37:01 PM4/1/21
to ccppb...@googlegroups.com
A função só retorna o tamanho do último bloco alocado no loop e não o maior bloco possível ou a quantidade de memória disponível. 

O valor retornado acaba sendo sempre o mesmo. 

Veja o link para o Compiler Explorer que postei em uma mensagem anterior. 

Em que sistemas e com quais compiladores você testou a função? 


Josué 



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.

Vilmar Pedro Votre

unread,
Apr 1, 2021, 8:04:17 PM4/1/21
to ccppb...@googlegroups.com
Olá Josué

Obrigado.

Eu sempre usei o G++, da GNU,  sob Linux, atualmente Debian.

Prometo tirar um tempo amanhã para fazer um teste checando a memória livre no início, após vários laços de alocação e após a liberação, para conferir se foi toda liberada.

Depois do teste encaminho o resultado.

Detalhe: sempre usei vector do STL e ele requer memória contínua. Por isso falei do maior bloco livre.
  - tenho a informação, não testada, de que deque compõe blocos, para usar toda a disponível quando estiver 
     fragmentada (deque é eficiente para inserção em ambas as pontas). Poderia obter mais memória.
  - set, com árvore RB, extremamente rápido, também poderia obter mais memória do que CoreLeft aponta.

Mas acho que a função do C++ Builder da Borland tinha o mesmo comportamento de CoreLeft. 

Isso permitiria uma avaliação melhor, mas limitada a um contexto (CPU e compilador). 

Cordialmente
    Prof. Vilmar  

Adriano dos Santos Fernandes

unread,
Apr 1, 2021, 8:12:55 PM4/1/21
to ccppb...@googlegroups.com
Vilmar,

Me descuple a maneira que me expressei.

Não sei se melhora a situação, mas achei que você tinha adquirido um
livro, e não que tinha escrito o mesmo. :D

Não acho que seja uma boa maneira de calcular.

Por exemplo, um allocator (ou malloc) customizável, ou usar funções do
SO seria melhor.


Adriano


On 01/04/2021 20:28, Vilmar Pedro Votre wrote:
> Olá Adriano
>
> Se você tem um trecho de programa que aloca, usa e depois libera memória
> o uso de CoreLeft que sugeri é:
>   - pergunta memória livre antes do trecho;
>  - pergunta pela memória livre após ter liberado.
> O assert checa se o valor é o mesmo, que é o esperado.
> De fato é bom tirar o teste do ambiente de produção.
>
> O código que usei se baseia no algoritmo de conversão de analógico para
> digital necessário nos computadores que
> controlam processos, por exemplo. 
> A conversão de digital para analógico é muito mais simples.
>
> Incluí o uso de exceção do C++ um item não trivial de aprender e
> extremamente útil. 
>
> Meu livro tem 700 páginas e quem o lê e usa tem gostado. 
>
> Eu já joguei muitos livros fora, mas não jogaria o meu.
>
> Desafio você a melhorar alguma parte dele. Estou precisando
> complementá-lo em cima das melhorias posteriores a c++11.   Topo
> discutir estes novos assuntos.
>
> Atenciosamente
>    Prof. Vilmar
>
>   
>
> Em qui., 1 de abr. de 2021 às 16:59, Adriano dos Santos Fernandes
> <adri...@gmail.com <mailto:adri...@gmail.com>> escreveu:
> <mailto:josue...@gmail.com <mailto:josue...@gmail.com>>> escreveu:
> >
> >     Não use essa função em produção porque pode fragmentar a memória.
> >
> >     Na verdade não entendi como essa função opera. Podia esclarecer?
> >     Testei aqui e tive o mesmo valor antes e depois de uma alocação de
> >     memória.
> >     Qual o significado do parâmetro Bits?
> >     Outra coisa, o comentário fala "se não conseguir alocar encerra o
> >     loop", mas você está usando *continue* que, bem, continua o loop.
> >
> >
> >
> >     Em qui., 25 de mar. de 2021 às 20:27, Vilmar Pedro Votre
> >     <vilma...@gmail.com <mailto:vilma...@gmail.com>
> <mailto:vilma...@gmail.com <mailto:vilma...@gmail.com>>> escreveu:
> <mailto:gy...@pq.uenf.br <mailto:gy...@pq.uenf.br>>> escreveu:
> >
> >             Bom dia prezados.
> >
> >             Estou com um problema no meu código, pois acho que em
> algum
> >             ponto ele está consumindo mais memória que o necessário.
> >
> >             Existe algo que eu possa fazer, para acompanhar o uso de
> >             memória?
> >
> >             Desde já agradeço.
> >
> >             --
> >             http://ccppbrasil.github.io/
> <http://ccppbrasil.github.io/> <http://ccppbrasil.github.io/
> <http://ccppbrasil.github.io/>>
> >             https://twitter.com/ccppbrasil
> <https://twitter.com/ccppbrasil> <https://twitter.com/ccppbrasil
> <https://twitter.com/ccppbrasil>>
> >              
> >             [&] C & C++ Brasil - http://www.ccppbrasil.org/
> <http://www.ccppbrasil.org/>
> >             <http://www.ccppbrasil.org/ <http://www.ccppbrasil.org/>>
> >             Para sair dessa lista, envie um e-mail para
> >             ccppbrasil-...@googlegroups.com
> <mailto:ccppbrasil-...@googlegroups.com>
> >             <mailto:ccppbrasil-...@googlegroups.com
> <mailto: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
> <mailto:ccppbrasil%2Bunsu...@googlegroups.com>
> >             <mailto:ccppbrasil+...@googlegroups.com
> <mailto:ccppbrasil%2Bunsu...@googlegroups.com>>.
>  <https://groups.google.com/d/msgid/ccppbrasil/CAMdN80Q%3DOftMxee1y9EXNjuu-A-8i%3DALCv3UenCmY55N8YUZZw%40mail.gmail.com?utm_medium=email&utm_source=footer
> <http://ccppbrasil.github.io/> <http://ccppbrasil.github.io/
> <http://ccppbrasil.github.io/>>
> >         https://twitter.com/ccppbrasil
> <https://twitter.com/ccppbrasil> <https://twitter.com/ccppbrasil
> <https://twitter.com/ccppbrasil>>
> >          
> >         [&] C & C++ Brasil - http://www.ccppbrasil.org/
> <http://www.ccppbrasil.org/>
> >         <http://www.ccppbrasil.org/ <http://www.ccppbrasil.org/>>
> >         Para sair dessa lista, envie um e-mail para
> >         ccppbrasil-...@googlegroups.com
> <mailto:ccppbrasil-...@googlegroups.com>
> >         <mailto:ccppbrasil-...@googlegroups.com
> <mailto: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
> <mailto:ccppbrasil%2Bunsu...@googlegroups.com>
> >         <mailto:ccppbrasil+...@googlegroups.com
> <mailto:ccppbrasil%2Bunsu...@googlegroups.com>>.
>  <https://groups.google.com/d/msgid/ccppbrasil/CACOovBB7xaNaLAfp7wFpM7XJUZvpSWM%2BfpyNstRE9jdm8%2BJBDg%40mail.gmail.com?utm_medium=email&utm_source=footer
> <https://twitter.com/ccppbrasil> <https://twitter.com/ccppbrasil
> <https://twitter.com/ccppbrasil>>
> >      
> >     [&] C & C++ Brasil - http://www.ccppbrasil.org/
> <http://www.ccppbrasil.org/>
> >     <http://www.ccppbrasil.org/ <http://www.ccppbrasil.org/>>
> >     Para sair dessa lista, envie um e-mail para
> >     ccppbrasil-...@googlegroups.com
> <mailto:ccppbrasil-...@googlegroups.com>
> >     <mailto:ccppbrasil-...@googlegroups.com
> <mailto: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
> <mailto:ccppbrasil%2Bunsu...@googlegroups.com>
> >     <mailto:ccppbrasil+...@googlegroups.com
> <mailto:ccppbrasil%2Bunsu...@googlegroups.com>>.
>  <https://groups.google.com/d/msgid/ccppbrasil/CACVaizRQ%2BJUkmNwOqz-BhPKiFQ%2Boj-LDFyiZ3Sa4tyfkLJ93cw%40mail.gmail.com?utm_medium=email&utm_source=footer
> <http://www.ccppbrasil.org/> <http://www.ccppbrasil.org/
> <http://www.ccppbrasil.org/>>
> > Para sair dessa lista, envie um e-mail para
> > ccppbrasil-...@googlegroups.com
> <mailto: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
> <mailto:ccppbrasil%2Bunsu...@googlegroups.com>
> > <mailto:ccppbrasil+...@googlegroups.com
> <mailto:ccppbrasil%2Bunsu...@googlegroups.com>>.
> <https://groups.google.com/d/msgid/ccppbrasil/CACOovBAhDSZKo6HLDzcccT-hcmLFO-eaSggWCJMNoTAv3%2BKN%3Dw%40mail.gmail.com?utm_medium=email&utm_source=footer
> <https://groups.google.com/d/msgid/ccppbrasil/CACOovBAhDSZKo6HLDzcccT-hcmLFO-eaSggWCJMNoTAv3%2BKN%3Dw%40mail.gmail.com?utm_medium=email&utm_source=footer>>.
>
> --
> 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
> <mailto:ccppbrasil%2Bunsu...@googlegroups.com>.
> <https://groups.google.com/d/msgid/ccppbrasil/b978aecb-3eb8-9fd0-a0f6-96c5420b24d1%40gmail.com>.
>
> --
> http://ccppbrasil.github.io/ <http://ccppbrasil.github.io/>
> https://twitter.com/ccppbrasil <https://twitter.com/ccppbrasil>
>  
> [&] C & C++ Brasil - http://www.ccppbrasil.org/ <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
> <mailto: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
> <https://groups.google.com/d/msgid/ccppbrasil/CACOovBBT%3DRz%3Dnti3%2BanetDJhs4th0-LkoML5PY1J2HNRWm89mA%40mail.gmail.com?utm_medium=email&utm_source=footer>.

Vilmar Pedro Votre

unread,
Apr 2, 2021, 1:24:49 PM4/2/21
to ccppb...@googlegroups.com
OK Adriano

Nenhum problema.

Programei em Assembler no passado. A vantagem é que o programador tem muito mais controle do que está acontecendo. Em um caso cheguei a programar diretamente linguagem de máquina.

A grande vantagem das funções na linha de spy é estreitar a região onde está o erro. CoreLeft é uma função deste
tipo. Há um módulo grande com vazamento de memória. Chamadas em diversos pontos reduzem o esforço de localizar o erro.  Debugger e trace são outras formas de fazer isso.

Obs. Uma amiga minha afirmou que escrever é uma tarefa massacrante. É preciso primeiro entender, depois achar o jeito adequado de explicar. Respeitando o vocabulário e a cultura do leitor. 

Abraços
    Vilmar  



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.

Vilmar Pedro Votre

unread,
Apr 2, 2021, 2:50:54 PM4/2/21
to ccppb...@googlegroups.com
Para Josué
     (código que usa CoreLeft)

O arquivo cpp anexo é de um artigo para o Dr. Dobbs Journal, que terminou não saindo pois 
precisava traduzir para o inglês, o que não fiz. O excelente jornal dos pŕogramadores raiz
encerrou em 2009 (começou em 1976).

A intenção era  comparar um algoritmo de busca de números não repetidos em coleções STL.
E com o tratamento de uniquer_ptr.
Reprogramei para usar set e o tempo cai de forma logarítmica.

Não houve tratamento de liberação adequada de memória. O CoreLeft mostra isso.

Observe que ele opera bem C++11.  

Cordialmente
   Prof. Vilmar
ContUniUPKrMem.cpp

Josue Andrade Gomes

unread,
Apr 2, 2021, 4:20:46 PM4/2/21
to ccppb...@googlegroups.com
Ainda tenho a segunda Dr. Dobb's que comprei. Edição Agosto de 1987. A matéria de capa era sobre o então futuro ANSI C.
É uma pena que não existam mais essa e outras revistas da área.
A Dr. Dobb's era realmente útil. Inúmeras vezes usei seus artigos em meus programas.




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.

Vilmar Pedro Votre

unread,
Apr 2, 2021, 8:32:15 PM4/2/21
to ccppb...@googlegroups.com
Boa noite Josué

Uma fonte interessante de dicas hoje é stackOverflow. 
Foi muito bom voltar a discutir C++, de que andei afastado estudando interface via Angular, NodeJS, Javascript e Mongodb. 
No caso vou usar o C++ para os cálculos que pedem alto desempenho. A ponte é via addon do Node que permite chamar uma função C++ e passar dados. 

Estou exatamente no ponto de programar as classes C++ do problema.

Cordialmente
   Vilmar  

de...@roo.com.br

unread,
Apr 2, 2021, 10:38:54 PM4/2/21
to ccppbrasil

Vilmar Pedro Votre

unread,
Apr 18, 2021, 8:12:29 PM4/18/21
to ccppb...@googlegroups.com
Para Josué

Boa noite.
Tirei um bom tempo para obseervar CoreLeft no contexto atual. 

Quando eu a usei e obtive resultados foi fazendo um sistema de Horários para o Mackenzie, em S. Paulo.
Usei boa parte do STL mas só com os ponteiros simples (raw pointers) que era o que havia.
No meu livro, que terminei de escrever em 2014 smart pointers ainda não estava bom nos compiladores.

Se você quiser experimentar a função para vê-la operando incluí o arquivo MemLivre.cpp.
Instrumentei a função para mostrar ela testando bit a bit. Usei a técnica de Nível de verbosidade (NiVerb)
para ecoar os resultados passo a passo. 

Decepção: mesmo com vector de unique_ptr não está sobrando a memória final esperada.

Por outro lado a memória livre (para o maior bloco contínuo) está variando entre execuções do programinha.

O mesmo acontece para o comando do sistema  (Linux Debian 9):
   free --giga -t

Vou submeter uma pergunta ao StackOverflow.

Obs. desconfiei de um tópico da norma C++14 que deixava a cargo do compilador o momento de liberar memória 
desde que não afetasse os efeitos observáveis. Mas conferi ainda hoje no GCC e isso foi descartado.

Cordialmente
   Prof. Vilmar  

MemLivre.cpp

Josue Andrade Gomes

unread,
Apr 19, 2021, 5:48:18 AM4/19/21
to ccppb...@googlegroups.com
OK, obrigado pela atualização.


Reply all
Reply to author
Forward
0 new messages