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.