[Resolvido] Estranha falha de segmentação em um while (C++)

5 respostas
DavidUser
Resumindo tenho um codigo com
unsigned int i = 1000;
  while(i <= 1000) {
 //... 
 }

Onde acontece uma falha de segmentação que não faz sentido ocorrer, sei que a falha é no while pois ao retiralo o codigo roda corretamente mas obviamente com apenas uma interação.

O trecho de código real segue abaixo:
void Interface::comparaMetodos() {
	cout << "\t\tComparando os a ordenação obtemos os seguinte resultados:" << endl << endl << endl;

	//gera os vetores para comparacao
	Ordena *vetorParaOrdenacao;
	//define fluxo para guardar a tabela de comparacao final
	stringstream tabelaFinal, compPorAtribuicao;

	tabelaFinal << "              comparacao atribuição" << endl; //14 espacos antes de metodo

	//CUIDADO código construido baseado na arquitetura de 64 bits

    unsigned int numeroDeElementos = 1000; //delimita o número de elementos inicial para as comparações

	long long **medicoes = new long long *[6];//vetor que guarda medicoes

	while (numeroDeElementos <= 1000) { //delimita o número máximo de elementos para as comparações
		//inicializa vetor
		vetorParaOrdenacao = new Ordena(numeroDeElementos);

		cout << "Os resultados para as comparações de " << numeroDeElementos << " elemtos:" << endl << endl;
		//coleta as medições da ordenação em MELHOR CASO
		preencheVetorCrescente(vetorParaOrdenacao);
		//não preenche novamente o vetor pois apos a execução de uma ordenação ele continua ordenado
		medicoes[0] = vetorParaOrdenacao->insercao();
		medicoes[1] = vetorParaOrdenacao->selecao();
		medicoes[2] = vetorParaOrdenacao->bolha();
		medicoes[3] = vetorParaOrdenacao->merge();
		medicoes[4] = vetorParaOrdenacao->quick();
		medicoes[5] = vetorParaOrdenacao->shell();

		cout << "Em relação ao numero de comparacoes:" << endl;
		//              |                  |                  |                  |                  |                  |                  |
		cout << "            insercao            selecao             bolha               merge              quick              shell      "
			 << endl << "melhor " << std::right;
		for (int i = 0; i < 6; i++)
			cout << setw(18) << medicoes[i][0] << ' ';
		cout << endl;

		compPorAtribuicao << "Em relação ao numero de atribuiçoes:" << endl;
		//                           |                  |                  |                  |                  |                  |                  |
		compPorAtribuicao << "melhor      insercao            selecao             bolha               merge              quick              shell      "
				<< endl << "melhor " << std::right;
		for (int i = 0; i < 6; i++)
			compPorAtribuicao << setw(18) << medicoes[i][1] << ' ';
		compPorAtribuicao << endl;

		//escreve na tabela Final
		long long *vetorBasico = new long long[6];
		for (int i = 0; i < 6; i++) vetorBasico[i] = medicoes[i][0];
		tabelaFinal << "       melhor " << setw(10) << std::right << menor(vetorBasico) << ' ';
		for (int i = 0; i < 6; i++) vetorBasico[i] = medicoes[i][1];
		tabelaFinal << setw(10) << menor(vetorBasico) << endl;
		delete []vetorBasico;

		for (int i = 0; i < 6; i++) delete []medicoes[i]; //deleta medicoes retornadas pelos métodos

		//coleta as medições da ordenação em MEDIO CASO
		preencheVetorAleatorio(vetorParaOrdenacao);
		medicoes[0] = vetorParaOrdenacao->insercao();
		preencheVetorAleatorio(vetorParaOrdenacao);
		medicoes[1] = vetorParaOrdenacao->selecao();
		preencheVetorAleatorio(vetorParaOrdenacao);
		medicoes[2] = vetorParaOrdenacao->bolha();
		preencheVetorAleatorio(vetorParaOrdenacao);
		medicoes[3] = vetorParaOrdenacao->merge();
		preencheVetorAleatorio(vetorParaOrdenacao);
		medicoes[4] = vetorParaOrdenacao->quick();
		preencheVetorAleatorio(vetorParaOrdenacao);
		medicoes[5] = vetorParaOrdenacao->shell();

		cout << "médio  " << std::right;
		for (int i = 0; i < 6; i++)
			cout << setw(18) << medicoes[i][0] << ' ';
		cout << endl;

		compPorAtribuicao << "médio  " << std::right;
		for (int i = 0; i < 6; i++)
			compPorAtribuicao << setw(18) << medicoes[i][1] << ' ';
		compPorAtribuicao << endl;

		//escreve na tabela Final
		for (int i = 0; i < 6; i++) vetorBasico[i] = medicoes[i][0];
		tabelaFinal << "  1000 médio  " << setw(10) << std::right << menor(vetorBasico) << ' ';
		for (int i = 0; i < 6; i++) vetorBasico[i] = medicoes[i][1];
		tabelaFinal << setw(10) << menor(vetorBasico) << endl;
		delete []vetorBasico;

		for (int i = 0; i < 6; i++) delete []medicoes[i]; //deleta medicoes retornadas pelos métodos

		//coleta as medições da ordenação em PIOR CASO
		preencheVetorDecrescente(vetorParaOrdenacao);
		medicoes[0] = vetorParaOrdenacao->insercao();
		preencheVetorDecrescente(vetorParaOrdenacao);
		medicoes[1] = vetorParaOrdenacao->selecao();
		preencheVetorDecrescente(vetorParaOrdenacao);
		medicoes[2] = vetorParaOrdenacao->bolha();
		preencheVetorDecrescente(vetorParaOrdenacao);
		medicoes[3] = vetorParaOrdenacao->merge();
		preencheVetorDecrescente(vetorParaOrdenacao);
		medicoes[4] = vetorParaOrdenacao->quick();
		preencheVetorDecrescente(vetorParaOrdenacao);
		medicoes[5] = vetorParaOrdenacao->shell();

		cout << "pior   " << std::right;
		for (int i = 0; i < 6; i++)
			cout << setw(18) << medicoes[i][0] << ' ';
		cout << endl;

		compPorAtribuicao << "pior   " << std::right;
		for (int i = 0; i < 6; i++)
			compPorAtribuicao << setw(18) << medicoes[i][1] << ' ';
		compPorAtribuicao << endl;

		//escreve na tabela Final
		for (int i = 0; i < 6; i++) vetorBasico[i] = medicoes[i][0];
		tabelaFinal << "       pior   " << setw(10) << std::right << menor(vetorBasico) << ' ';
		for (int i = 0; i < 6; i++) vetorBasico[i] = medicoes[i][1];
		tabelaFinal << setw(10) << menor(vetorBasico) << endl;
		delete []vetorBasico;

		for (int i = 0; i < 6; i++) delete []medicoes[i]; //deleta medicoes retornadas pelos métodos

		string compAtt = compPorAtribuicao.str();
		cout << compAtt << endl;
		//destroi vetor
		delete vetorParaOrdenacao;

		numeroDeElementos *= 10; //almenta o numero de elementos por comparações por etapa
	}
	delete []medicoes;

	cout << "TABELA FINAL" << endl;
	cout << tabelaFinal.str() << endl;

}

5 Respostas

DavidUser

Enfim encontrei o problema, é que o método str() da stringstream retorna uma refência para o objeto string membro e não uma cópia.

Falha minha que não li corretamente a documentação.

DavidUser

Não resolvi realmente o problema tenho uma nova falha de segmentação ao percorrer uma segunda vez o código no while.

DavidUser

O erro é sempre na segunda interação e retorna como erro:

*** glibc detected *** /media/dados/Documents/Workspace/EstruturaDeDados/sort_varios/Debug/sort_varios: double free or corruption (fasttop): 0x000000000103bad0 *** ======= Backtrace: ========= /lib/libc.so.6(+0x774b6)[0x7fbcb3b604b6] /lib/libc.so.6(cfree+0x73)[0x7fbcb3b66c83] /media/dados/Documents/Workspace/EstruturaDeDados/sort_varios/Debug/sort_varios[0x403975] /media/dados/Documents/Workspace/EstruturaDeDados/sort_varios/Debug/sort_varios[0x405366] /lib/libc.so.6(__libc_start_main+0xfe)[0x7fbcb3b07d8e] /media/dados/Documents/Workspace/EstruturaDeDados/sort_varios/Debug/sort_varios[0x4011d9] ======= Memory map: ======== 00400000-00407000 r-xp 00000000 08:04 203786 /media/dados/Documents/Workspace/EstruturaDeDados/sort_varios/Debug/sort_varios 00606000-00607000 r--p 00006000 08:04 203786 /media/dados/Documents/Workspace/EstruturaDeDados/sort_varios/Debug/sort_varios 00607000-00608000 rw-p 00007000 08:04 203786 /media/dados/Documents/Workspace/EstruturaDeDados/sort_varios/Debug/sort_varios 01037000-01058000 rw-p 00000000 00:00 0 [heap] 7fbcac000000-7fbcac021000 rw-p 00000000 00:00 0 7fbcac021000-7fbcb0000000 ---p 00000000 00:00 0 7fbcb3ae9000-7fbcb3c63000 r-xp 00000000 08:01 3029308 /lib/libc-2.12.1.so 7fbcb3c63000-7fbcb3e62000 ---p 0017a000 08:01 3029308 /lib/libc-2.12.1.so 7fbcb3e62000-7fbcb3e66000 r--p 00179000 08:01 3029308 /lib/libc-2.12.1.so 7fbcb3e66000-7fbcb3e67000 rw-p 0017d000 08:01 3029308 /lib/libc-2.12.1.so 7fbcb3e67000-7fbcb3e6c000 rw-p 00000000 00:00 0 7fbcb3e6c000-7fbcb3e81000 r-xp 00000000 08:01 3014735 /lib/libgcc_s.so.1 7fbcb3e81000-7fbcb4080000 ---p 00015000 08:01 3014735 /lib/libgcc_s.so.1 7fbcb4080000-7fbcb4081000 r--p 00014000 08:01 3014735 /lib/libgcc_s.so.1 7fbcb4081000-7fbcb4082000 rw-p 00015000 08:01 3014735 /lib/libgcc_s.so.1 7fbcb4082000-7fbcb4104000 r-xp 00000000 08:01 3029319 /lib/libm-2.12.1.so 7fbcb4104000-7fbcb4303000 ---p 00082000 08:01 3029319 /lib/libm-2.12.1.so 7fbcb4303000-7fbcb4304000 r--p 00081000 08:01 3029319 /lib/libm-2.12.1.so 7fbcb4304000-7fbcb4305000 rw-p 00082000 08:01 3029319 /lib/libm-2.12.1.so 7fbcb4305000-7fbcb43ed000 r-xp 00000000 08:01 134737 /usr/lib/libstdc++.so.6.0.14 7fbcb43ed000-7fbcb45ec000 ---p 000e8000 08:01 134737 /usr/lib/libstdc++.so.6.0.14 7fbcb45ec000-7fbcb45f4000 r--p 000e7000 08:01 134737 /usr/lib/libstdc++.so.6.0.14 7fbcb45f4000-7fbcb45f6000 rw-p 000ef000 08:01 134737 /usr/lib/libstdc++.so.6.0.14 7fbcb45f6000-7fbcb460b000 rw-p 00000000 00:00 0 7fbcb460b000-7fbcb462b000 r-xp 00000000 08:01 3029322 /lib/ld-2.12.1.so 7fbcb4804000-7fbcb4809000 rw-p 00000000 00:00 0 7fbcb4828000-7fbcb482b000 rw-p 00000000 00:00 0 7fbcb482b000-7fbcb482c000 r--p 00020000 08:01 3029322 /lib/ld-2.12.1.so 7fbcb482c000-7fbcb482d000 rw-p 00021000 08:01 3029322 /lib/ld-2.12.1.so 7fbcb482d000-7fbcb482e000 rw-p 00000000 00:00 0 7fff7453b000-7fff7455c000 rw-p 00000000 00:00 0 [stack] 7fff745ff000-7fff74600000 r-xp 00000000 00:00 0 [vdso] ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]

ViniGodoy

Oi David, por favor, não banalize as tags informativas no título dos tópicos (como [Resolvido], [PHP], etc), usando-as para falar algo óbvio, como [Duvida], [Problema], [Java], [Ajuda].

Você já rodou o código com o depurador para ver exatamente em que linha o segmentation fault ocorre? Provavelmente é dentro de um dos métodos de ordenação.

DavidUser

Encontrei o problema, pura falta de atenção, estava desalocando o ponteiro vetorbasico e depois tentando reutilizá-lo sem realocar memória.

Peço desculpas.

Criado 30 de setembro de 2011
Ultima resposta 2 de out. de 2011
Respostas 5
Participantes 2