Página 1 de 1

hb_xrealloc

Enviado: 20 Jan 2010 08:49
por sambomb
---------------------------
Erro irrecuper vel 9009:
---------------------------
hb_xrealloc nao pode realocar mem¢ria
---------------------------
OK
---------------------------
Alguem sabe o que pode causar esse erro?

Re: hb_xrealloc

Enviado: 24 Jan 2010 15:10
por sygecom
Já vi esse erro antes, mas nunca soube como e por que acontece isso...

Re: hb_xrealloc

Enviado: 25 Jan 2010 13:37
por sambomb
Já me disseram que pode ser problema de hardware, para resolver é simples é só utilizar sysrefresh() ou atualizar um aspecto visual de um dialogo(como o titulo da janela) em ambos os casos vai reconfigurar o manejamento da memória

Re: hb_xrealloc

Enviado: 31 Jan 2010 11:31
por sygecom
O Problema é saber quando vai dar o erro para poder dar esse sysrefresh().

hb_xrealloc

Enviado: 16 Out 2025 17:09
por fladimir
Descobri como ocorre mas não sei commo resolver

Executem o código abaixo e veja se ocorre o erro Unrecoverable error 9009: hb_xrealloc can't reallocate memory

Aki ocorre e pelo q pesquisei teria q fazer um Garbage collector algo assim pq é erro de alocação de memória, mas... no Harbour 3.4 não tem essa função

Criei baseado no código fonte do xharbour uma usando funções em C mas tb não resolveu o problema.

Alguém sabe como resolver? Tenho um sistema legado q gostaria de resolver essa questão q ocorre eventualmente em determinadas rotinas.

Código: Selecionar todos

	LOCAL cString := "", i, adados := {}
	FOR i := 1 TO 1000000  
		cString += "mais dados aqui"  

		aadd(adados, { i, {i, cString} } )

 		/*
                 IF i % 1000 == 0  
			hb_gcAll(.T.)
		ENDIF
                */
	NEXT

hb_xrealloc

Enviado: 17 Out 2025 11:15
por ivanil
Ola,

De uma revisada em seu código;
esta dentro de for que vai ate 1.000.000, alimentando uma matriz com o incremento da variável cString a cada salto, haja memoria para lidar com isso;
Somente o ultimo elemento da matriz, caso chegasse nele já seria uma string de 15x1.000.000;


;

at

hb_xrealloc

Enviado: 17 Out 2025 16:07
por fladimir
Grato pelo retorno, ali foi pra demonstrar o problema pode reduzir o nr de interações, o fato é q minha aplicação não tem rotinas dessa magnitude e o erro ocorre, o q precisao saber é como fazer com funcione o garbage collector ou outra alternativa para resolver esse erro.

hb_xrealloc

Enviado: 17 Out 2025 16:33
por fladimir
Fiz um teste aki e não passa de 50700 iterações, minha maquina tem 48GB de memoria, menos q isso blz passa, mudei string para apenas "." para consumir menos espaço.

hb_xrealloc

Enviado: 17 Out 2025 17:22
por ivanil
seu problema esta em cString +=; ela se se expande ate 1000000 x o tamanho, a memória estoura muito antes disso...

hb_xrealloc

Enviado: 19 Out 2025 14:10
por JoséQuintas
Como já foi dito, NO CASO DESSE TESTE, o erro foi por estouro de memória.

A questão que fica é se o erro mencionado no início do post também se refere a estouro de memória.

Estouro de memória é usar memória demais.
Não se trata de mudar pra 64 bits, ou de colocar mais memória.
A primeira coisa a verificar é se a rotina não está gastando memória demais.

É tentar avaliar em que momento ocorre o erro.
Num caso de grandes volumes de informação, passar por referência pode economizar muita memória.
Passar 1GB por referência economiza 1GB de memória.

Também o uso de opções do linqueditor e/ou linqueditores mais novos.
O default do mingw atual é 4GB pra aplicativos 32 bits.
Isso ajuda.

Mas pode ter abuso sem perceber

Código: Selecionar todos

a := Processa( b )
Sei lá a parte interna, mas num caso desses, 500MB pode estourar.
Tem a variável B ocupando 500MB, tem o uso na rotina mais 500MB, conforme a rotina mais cópias dos 500MB, talvez o retorno mais 500MB, etc.
Ou em browse, variável original, variável do browse, variáveis da lib, etc.
Acaba sendo relativamente fácil desperdiçar memória sem perceber, e até estourar o limite.
A gente pensa no limite de uma variável, mas esquece que o conteúdo se multiplica.
É tentar avaliar a rotina aonde isso acontece.

Tanto faz se é harbour ou xharbour, se mingw ou blinker, se windows ou linux, limites existem, e passar variáveis por rotinas multiplicam o conteúdo.