Pergunta

Eu praticamente terminei minha primeira aplicação Symbian de trabalho, mas na minha aprendizagem acelerada têm prestado pouca atenção à gestão de memória e empurrando para e limpeza da pilha?

Poderia alguém por favor me aponte na direcção de algumas das melhores práticas para usar aqui, e talvez alguns dos melhores detecção de fugas de memória / profiling ferramentas.

Por exemplo, se eu pegar um TDesC ou um TPtrC16 dentro de uma função, como eu, em seguida, limpá-los da melhor maneira, é simplesmente

TPtrC16 temp = ...
temp.CleanupClosePushL();
CleanupStack::PopAndDestroy()

.. por tudo?

Obrigado e por favor me perdoe, eu sou um auto confessou n00b Symbian.

Foi útil?

Solução

Eu tenho no passado utilizado HookLogger da Symbian para trace e investigar vazamentos de memória. Não é o melhor, mas com certeza não ajuda. Além disso, os marcadores heap levantar pânicos Alloc em caso de vazamentos de memória sempre que sua saída sua aplicação. As informações desses pânicos fornecer é apenas útil, mas é boa indicação de que há um algum lugar vazamento de memória. De lá, você pode usar ferramentas como HookLogger para aproximar a imagem de que parte do código do vazamento está sendo introduzido em.

Eu mencionei alguns recursos Symbian em resposta a esta discussão . Enquanto todos aqueles ter sido mais útil para mim, eu fiz encontrar o livro Accredited Symbian desenvolvedor Primer extremamente útil. Se você poderia começar suas mãos sobre ele, eu definitivamente recomendo. É uma leitura rápida, mas explica os conceitos de forma brilhante, incluindo coisas sobre gerenciamento de memória e descritores.

Outras dicas

As coisas armazenados na pilha não precisa ser armazenado na pilha de limpeza (a menos que eles precisam de tratamento especial (Classes R etc, veja abaixo))

A pilha de limpeza é para objetos exclusão quando uma licença (pense exceção) ocorre, o que faria a memória de outra forma vazamento.

O uso real da pilha de limpeza é através das funções estáticas CleanupStack :: pushl (..) e CleanupStack :: Pop / PopAndDestroy.

Algumas classes, como rarquivo, a RFS tem que fechado em vez de excluído, portanto, para essas funções têm sua :: Close função chamada assim que você deve usar a função global CleanupClosePushL (), que em vez de chamar o operador delete no seu objeto em uma licença, ele chama a classe :: close função em vez.

Para verificar o código para vazamentos de memória, você pode usar as macros __UHEAP_MARK; e __UHEAP_MARKEND; que irá verificar que nada é deixado na pilha de entre estas duas chamadas.

Se você deixar nada no CleanupStack no de um CActive :: RunL, o programador ativo irá entrar em pânico.

Como uma técnica geral, se uma função que você está chamando pode licença, (indicado por uma fuga 'L'), então anythign que deve ser excluído ou fechado (etc) deve ser adicionado ao limpeza de pilha.

É preciso um pouco menos de 10 páginas para adequadamente exmplain tudo o que você precisa saber sobre a gestão CleanupStack e memória para Symbian C ++.

plugue

Shameless: este livro foi escrito especificamente para o seu nível de n00bness: http://www.quickrecipesonsymbianos.com

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top