Jump to content

Recommended Posts

Posted (edited)

Boa noite,

Estou com um problema, tenho um programa que me dá erro no malloc, erro qualquer coisa do tipo:

malloc.c:3096: sYSMALLOc: Assertion(...) failed.

Qualquer coisa do genero

malloc.c:3096: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed.

Usando o valgrind dá-me:


==2403== HEAP SUMMARY:
==2403==     in use at exit: 2,426,978,281 bytes in 160,906 blocks
==2403==   total heap usage: 160,909 allocs, 0 frees, 2,426,978,281 bytes allocated
==2403== 
==2403== LEAK SUMMARY:
==2403==    definitely lost: 2,415,750,799 bytes in 160,429 blocks
==2403==    indirectly lost: 21,692 bytes in 19 blocks
==2403==      possibly lost: 11,205,438 bytes in 457 blocks
==2403==    still reachable: 352 bytes in 1 blocks
==2403==         suppressed: 0 bytes in 0 blocks
==2403== Rerun with --leak-check=full to see details of leaked memory
==2403== 
==2403== For counts of detected and suppressed errors, rerun with: -v
==2403== Use --track-origins=yes to see where uninitialised values come from
==2403== ERROR SUMMARY: 160922 errors from 9 contexts (suppressed: 17 from 6)

Já andei às voltas nisto e nada. Alguém faz ideia porque dá erro? Parece alguma memoria corrompida, pode ser falta de algum free ou algo do género?

Obrigado pela atenção,

alves077

Edited by alves077
Posted

Aquilo que eu vejo no relatório do Valgrind é que estás a utilizar mais de 2GB de memória dos quais já só tens referência para 352 bytes. Alguma coisa está claramente mal 🙂

Devem faltar-te uns quantos free() no teu programa.

“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Posted (edited)

Sim já fiz entretanto uns free's, agora dá-me "segment fault" num free, supostamente.

Existe algum tipo de problema num ciclo no inicio alocar e depois no final fazer free?

Tipo isto:

do{
char* teste=(char*) calloc(sizeof(char),contador);
...
free(teste);
}while(hd==10)

Obrigado pela atenção,

alves077

Edited by alves077
Posted (edited)

Sim já fiz entretanto uns free's

deverias fazer todos ...

Existe algum tipo de problema num ciclo no inicio alocar e depois no final fazer free?

não, no entanto duvido que seja necessário fazer esse tipo de brincadeiras

Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Posted

deverias fazer todos ...

não, no entanto duvido que seja necessário fazer esse tipo de brincadeiras

Sim fazer em todos. Acredito que haja outra maneira. Como em cada iteração do ciclo alocar um array de contador elementos?

Aloco antes e vou re-alocando na memoria? Se sim como posso fazer asssim?

Obrigado pela atenção,

alves077

Posted

estas a dizer que não sabes à partida quantos elementos necessitas ?

para que queres um array de contadores ?

Em cada iteração preciso de um array de x elementos, sendo que este x varia.

Posted

Mas, por exemplo, existe alguma maneira de limpar o array a cada iteração? Por que a proxima iteração pode ter menos elementos e não queria que os da passada iteração continuassem no array.

Obrigado pela atenção,

alves077

Posted

Um dos meus problemas é que preciso de array de char's. Também podia por uma caracter não utilizado e depois verificava, mas não queria fazer, Pus no ciclo

char* teste=new char[tamanho];
(...)
delete [] teste;

Ao correr ele aborta dá-me um erro qualquer coisa assim:

*** glibc detected *** double free or corruption

Mostra lixo da stack (acho eu)

Abortado

Posted (edited)

ok 🙂

Tens razão o que tenho é +/- isto:


 do{

		 char*  str= new char[300];

		count++;

		str = construir(test, count);

	   pos = procura(str,0);

		delete [] str;
	}while (pos<0);

Chama a função construir


char* construir(int test, int size) {


char* result=new char[size];
char* str=new char[size];
int count = 0;

str[size] = 0;

for (i = size; i >= 0; i--) {
	str[i] = test + 50;
}

  for (int i = strlen(str) -  size; i < strlen(str); i++) {
	result[count] = str[i];
	count++;
}
delete [] str;

return result;
}


Qualquer coisa assim... Ele não passa da função construir da parece que "arrebenta" no delete [] str.

Obrigado pela atenção,

alves077

Edited by alves077
Posted

meu deus ...

do{
 char* str= new char[300]; // estas a alocar memória
 count++;
 str = construir(test, count); // estas a perder a posição de memória alocada anteriormente
 pos = procura(str,0);
 delete [] str;
}while (pos<0);

char* construir(int test, int size) {
 char* result=new char[size];
 char* str=new char[size];

 int count = 0;
 str[size] = 0; // str não tem a posição "size", isto só vai de 0 a size - 1

 for (i = size; i >= 0; i--) { // i não está declarado .. nem sei como isto compila
   str[i] = test + 50;
 }

 // se nenhum valor de str tem o valor de 0 devido ao for anteror strlen não faz sentido
 for (int i = strlen(str) -  size; i < strlen(str); i++) {
   result[count] = str[i];
   count++;
 }
 delete [] str;

 return result;
}

resumidamente, o teu código não faz sentido nenhum

o que queres fazer na realidade ?

IRC : sim, é algo que ainda existe >> #p@p

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.