Como detectar erros obscuros com o new e delete do C++

O Adonai Silveira Canez, teve uma dúvida na lista cppbrasil sobre um erro obscuro, que ocorria as vezes, ou de vez em quando no programa dele.

Veja o bloco de códoigo abaixo:


// ident
char *ident;
int pos, startString, endString;
startString = endString = 52;
for (endString = 52; wayPointDatas[endString] != 0x00; endString++);
ident = new char(endString - startString + 1);
pos = 0;
for (; startString < endString; startString++) {
ident[pos] = (char) wayPointDatas[startString];
pos++;
}
ident[pos] = '\0';
setIdent(string(ident));
delete ident;

Segundo o Adriano dos Santos Fernandes:

Tem dois (tipos de) problemas no seu código:
1) Não é new char(tamanho) e sim new char[tamanho]
2) Corrigindo (1), vc deverá usar delete [] ident

Novamente o Adonai Silveira Canez teve a seguinte dúvida:

Adriano, eu achava que usando o new eu devia usar o () , como faço com outros objetos. Gostaria de saber porque não dá erro de compilação da forma que eu estava fazendo, e o que ele estava gerando o com o new da forma que fiz.
Uma coisa que tenho dúvida é se ao usar o delete devo colocar o [].

A resposta do Adriano dos Santos Fernandes foi a seguinte:

new char(10) aloca um byte e coloca o valor 10. No seu algoritmo vc usa o ponteiro como se fosse um vetor, ou seja, deveria ser 10 elementos, então deve se usar o new [].

Sempre que você aloca com new[] deve desalocar com delete[].

O Gianni complementou com o seguinte:


new foo(X) // Chama o construtor de foo. ou seja: new char(X) chama o construtor de char; equivale à:

char *c = malloc(1);
*c = X;

e como o Adriano disse, [] é para vetores:

char *c = new char[X];

equivale à:

char *c = malloc(X);

A sugestão do Tiago Natel de Moura para detectar esse tipo de erro é usar o Valgrind.

Outra sugestão do max foi a seguinte:

Tenta das duas formas (usando o operator new[] e o new) e olha no teu
debugador o resultado: com new[] tu cria um vetor de doubles e com new
tu cria *um* double.

O double() é “só” um construtor.

  • Share/Bookmark

Post a Comment

Your email is never shared. Required fields are marked *

*
*