alves077 Posted November 29, 2012 at 11:10 PM Report #485200 Posted November 29, 2012 at 11:10 PM (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 November 29, 2012 at 11:49 PM by alves077
KTachyon Posted November 30, 2012 at 01:36 AM Report #485214 Posted November 30, 2012 at 01:36 AM 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
alves077 Posted November 30, 2012 at 08:50 PM Author Report #485277 Posted November 30, 2012 at 08:50 PM (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 November 30, 2012 at 08:52 PM by alves077
HappyHippyHippo Posted November 30, 2012 at 08:56 PM Report #485278 Posted November 30, 2012 at 08:56 PM (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 November 30, 2012 at 08:56 PM by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
alves077 Posted November 30, 2012 at 09:03 PM Author Report #485279 Posted November 30, 2012 at 09:03 PM 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
HappyHippyHippo Posted November 30, 2012 at 09:07 PM Report #485281 Posted November 30, 2012 at 09:07 PM estas a dizer que não sabes à partida quantos elementos necessitas ? para que queres um array de contadores ? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
alves077 Posted November 30, 2012 at 09:10 PM Author Report #485284 Posted November 30, 2012 at 09:10 PM 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.
HappyHippyHippo Posted November 30, 2012 at 09:38 PM Report #485288 Posted November 30, 2012 at 09:38 PM qual o x máximo ? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
alves077 Posted November 30, 2012 at 10:49 PM Author Report #485299 Posted November 30, 2012 at 10:49 PM (edited) Pode chegar ou não ao maximo, o pior caso é 300. Isto é pode ser só 1 elemento como pode ser os 300 elementos, no pior caso. Edited December 1, 2012 at 12:25 AM by alves077
HappyHippyHippo Posted December 1, 2012 at 08:49 AM Report #485312 Posted December 1, 2012 at 08:49 AM então basta teres: int[] contadores = new int[300]; for () { } delete [] contadores; sem malloc e sem free, isto porque se estas a fazer em cpp, o que se deve usar é o new e o delete IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
alves077 Posted December 1, 2012 at 02:47 PM Author Report #485320 Posted December 1, 2012 at 02:47 PM 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
HappyHippyHippo Posted December 1, 2012 at 03:43 PM Report #485325 Posted December 1, 2012 at 03:43 PM (edited) memset(contadores, 0, sizeof(contadores)); Edited December 1, 2012 at 03:44 PM by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
alves077 Posted December 1, 2012 at 04:13 PM Author Report #485328 Posted December 1, 2012 at 04:13 PM 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
HappyHippyHippo Posted December 1, 2012 at 04:17 PM Report #485329 Posted December 1, 2012 at 04:17 PM enquanto não apresentares todo o teu código é como jogar ao quarto escuro : "é engraçado andar às apalpadelas à procura da outra pessoa, mas que vai levar tempo, ai isso vai" IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
alves077 Posted December 1, 2012 at 04:30 PM Author Report #485330 Posted December 1, 2012 at 04:30 PM (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 December 1, 2012 at 04:31 PM by alves077
HappyHippyHippo Posted December 1, 2012 at 05:14 PM Report #485336 Posted December 1, 2012 at 05:14 PM 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 Portugol Plus
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now