Desalocando memória em uma DLL

2 respostas
L

Estou fazendo um teste com uma biblioteca de PDF, mas está ocorrendo um erro que não consegui entender o porquê.

Quando utilizo um determinado recurso a biblioteca ( que é uma DLL ) aloca um array em um ponteiro

private: double* pointer;
e em um método aloca um array neste ponteiro

No destrutor desta classe a biblioteca desaloca este array

Mas isto está causando o seguinte erro:

<blockquote> 	ntdll.dll!7c962364() 	

kernel32.dll!7c85eb5f() 	

>	msvcr71d.dll!_CrtIsValidHeapPointer(const void * pUserData=0x009d3ca0)  Line 1807	C

msvcr71d.dll!_free_dbg_lk(void * pUserData=0x009d3ca0, int nBlockUse=1)  Line 1132 + 0x9	C

msvcr71d.dll!_free_dbg(void * pUserData=0x009d3ca0, int nBlockUse=1)  Line 1070 + 0xd	C

msvcr71d.dll!operator delete(void * pUserData=0x009d3ca0)  Line 54 + 0x10	C++

msvcr71d.dll!operator delete[](void * p=0x009d3ca0)  Line 21 + 0x9	C++

podofo.dll!PoDoFo::PdfTable::~PdfTable()  Line 91 + 0x12	C++

009d3ca0()	

Teste.exe!createTable2(PoDoFo::PdfPainter * pPainter=0x0012fbe4, PoDoFo::PdfFont * pFont=0x00a98470, double pageSize=595.00000000000000)  Line 101 + 0x1e	C++

Teste.exe!PPP(const char * pszFilename=0x00451880)  Line 562 + 0x1f	C++</blockquote>

Estou utilizando o Visual Studio .Net 2003 com windows XP, compilei a biblioteca com o mesmo.

2 Respostas

T

Bem-vindo ao mundo da programação C++ e dos erros misteriosos e mal-explicados!

De fato, seu programa está sintaticamente correto, e se você aloca os dados em um lugar, deve desalocá-los em outro.

Dicas:
a) No construtor desse objeto, inicialize explicitamente o double* com NULL (ou 0).
Isso porque pode ser que você nunca tenha chamado o tal método que faz a alocação, e o destrutor é sempre chamado.
Não dá problemas se você chamar delete[] pointer com pointer == 0.
Faça como no Java (embora pareça mais lento), ou seja, sempre inicialize as variáveis de instância com valores conhecidos, até para evitar eventuais dissabores.
Já tive alguns problemas quando, depois de programar durante anos só com Java, tive de voltar ao C++, justamente porque havia me esquecido que o Java sempre deixa as variáveis de instância com valores conhecidos ao se alocar um objeto.

b) Pode ser que alguma outra coisa (sei lá o quê) tenha bagunçado a variável “pointer”. O que foi, e como resolver, é por sua conta e risco.

L

Verifiquei que este ponteiro é inicializado com NULL.

E como vc disse ele apenas é alocado e desalocado se eu utilizar o recurso, caso contrário, com um if ele nem chama o delete. E se eu não utilizá-lo funciona perfeitamente, mas para variar eu preciso do safado.

Fiz um teste comentando o código do delete [] pointer; desta forma funcionou perfeitamente, mas claro que isso deixou um memory leak.

Já vasculhei a classe e ela não faz nenhum uso suspeito desta variável, bom vou continuar procurando alguma coisa.

Vlw

Criado 23 de julho de 2009
Ultima resposta 23 de jul. de 2009
Respostas 2
Participantes 2