Liberar memória no C++

7 respostas
lucas_carvalho100

Pessoal eu de novo com o c++....

Estou com o seguinte problema, criei um método que concatena alguns char's*, até ai tudo bem.. ele funciona blz... Vou mostrar o código....
char* LogErros::montaInsert(int idRegistro, char* tab_origem, 
							char* tab_destino, char* fase,
						    char* campo, char* valor, 
							DescricaoErro descricaoErro, char* sistema,
							char* tipo)
{
	char* sqlInsert;
	
	sqlInsert = "INSERT INTO LOG_ERROS (REGISTRO_ID, TABELA_ORIGEM, TABELA_DESTINO, FASE, CAMPO, VALOR, DESCRICAO, SISTEMA_ORIGEM, TIPO) VALUES (";	
	
	char registroIdChar[15];// = new char[15];
	sprintf(registroIdChar,"%d",idRegistro);

	char* descricaoErroChar = this->getDescricaoErro(descricaoErro);
	
	int tamanho = strlen(registroIdChar) + strlen(tab_origem) +
				  strlen(tab_destino) + strlen(fase) + 
				  strlen(campo) + strlen(valor) + strlen(descricaoErroChar) +
				  strlen(sistema) + strlen(tipo) + 10;

	char* retorno = new char[tamanho];	
	strcpy(retorno, sqlInsert); 		
	strcat(retorno,registroIdChar);
	strcat(retorno,",'");
	strcat(retorno,tab_origem);
	strcat(retorno,"','");
	strcat(retorno,tab_destino);
	strcat(retorno,"','");
	strcat(retorno,fase);
	strcat(retorno,"','");
	strcat(retorno,campo);
	strcat(retorno,"','");
	strcat(retorno,valor);
	strcat(retorno,"','");
	strcat(retorno,descricaoErroChar);
	strcat(retorno,"','");
	strcat(retorno,sistema);
	strcat(retorno,"','");
	strcat(retorno,tipo);
	strcat(retorno,"')");	

	return retorno;
}

No entanto quando eu uso ele e vou fazer mais alguma operações que exigem muita memória da um erro "bad allocation" e o programa para de funcionar... Gostaria de saber como eu poderia fazer para otimizar o código acima, ou liberar a memória ou ainda saber o que estou fazendo errado...

Agradeço a ajuda...

7 Respostas

E

Use std::string em vez de char*. Char*, se você não souber usá-lo, é a mãe e o pai de muitos erros, principalmente os de alocação.

lucas_carvalho100

Vou mudar os parâmetros do método e posto o resultado.

Obrigado entanglement você e o VinyGodoy tem me ajudado muito. Muito obrigado.

ViniGodoy

entanglement:
Use std::string em vez de char*. Char*, se você não souber usá-lo, é a mãe e o pai de muitos erros, principalmente os de alocação.

Tirou as palavras da minha boca. Sem falar que o std::string costuma a ter melhor performance do que o char* (eu mesmo já comprovei isso várias vezes em diversos profilings).

Procurar por um \0 no final da string é um custo extremamente alto, que todo char* paga.

E

Bem-vindo ao mundo dos vazamentos de memória. Só há uma maneira de evitá-los: evitar criá-los em primeiro lugar. Uma forma é o uso de smart pointers (veja www.boost.org ) E a outra é o uso judicioso de std::string.

ViniGodoy

É bom lembrar que meu portal, também tem artigos sobre Smart Pointers, em português:
http://www.pontov.com.br/site/index.php/cpp/43-smart-pointers/52-smart-pointer-introducao

lucas_carvalho100

entanglement:
Use std::string em vez de char*. Char*, se você não souber usá-lo, é a mãe e o pai de muitos erros, principalmente os de alocação.

Entanglement troquei para string e funcionou de primeira, a unica coisa que não consegui é concatenar as string’s assim:

// Isso aqui é só um exemplo
string nome, sobrenome,nomecompleto;

nomecompleto = nome + sobrenome; // dessa forma nao funciona

Quando coloco igual a cima ele da esse erro : error C2784: ‘std::_String_iterator<_Elem,_Traits,_Alloc> std::operator +(_String_iterator<_Elem,_Traits,_Alloc>::difference_type,std::_String_iterator<_Elem,_Traits,_Alloc>)’ : could not deduce template argument for ‘std::_String_iterator<_Elem,_Traits,_Alloc>’ from ‘std::string’

Agora quando faço assim:

// Isso aqui é só um exemplo
string nome, sobrenome,nomecompleto;

nomecompleto += nome;
nomecompleto += sobrenome;

Funciona blz… o problema que assim eu achei que ficou muito estranho, pois são várias concatenações…

To dando uma pesquisada no google para ver se eu acho o problema… Mas por enquanto ta rodando…

Obrigado pela ajuda…

E

Tem coisa estranha. Para mim funciona direitinho.

#include <string>
#include <iostream>
using namespace std;

int main (int argc, char* argv[]) {
    string nome, endereco, telefone;
    nome = endereco + telefone;
    cout << nome << endl;
}
Criado 22 de novembro de 2010
Ultima resposta 25 de nov. de 2010
Respostas 7
Participantes 3