Liberar memória no C++

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…

[code]
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;

}[/code]

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…

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.

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

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

[quote=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.
[/quote]

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.

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.

É 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

[quote=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.
[/quote]

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…

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;
}