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.

Re: hb_xrealloc

Enviado: 07 Dez 2025 18:13
por Claudio Soto
Está función de HB se basa en realloc() una función de C que expande o contrae un bloque de memoria, conservando los datos originales (copia el contenido del bloque original al nuevo bloque). Si no hay suficiente espacio contiguo, asigna un nuevo bloque en otra ubicación y copia los datos, liberando el antiguo.
Porque puede fallar:
1) Se utilizo todo el espacio de direcciones virtuales (ej. en 32 bits el SO entero no puede utilizar más de 4 GB de ram)
2) La memoria se ha fragmentado tanto que no hay disponible un rango contiguo de direcciones del tamaño solicitado (ej. se asigna y se liberan varios fragmentos de memoria)
3) La máquina se quedó sin memoria física, porque el propio programa la ha usado toda o porque otros programas que se ejecutan en la máquina la han usado toda.
4) La fragmentación de la memoria puede ser resultado del funcionamiento de otros programas