Работа с символами в C ++ (без std :: string) - PullRequest
1 голос
/ 20 ноября 2010

У меня есть этот код:

char* value = "abcdefg";

char* secondValue = value;

Второе значение получит адрес значения ок? Если я удалю «значение», второе значение будет недоступно, я прав?

так что я должен сделать:

char* value = "abcdefg";
secondValue = new char[strlen(value)];
strcpy(secondValue, value);

Поэтому, если я удалю «значение», нет проблем.

И, наконец, чтобы освободить второе значение, которое я должен сделать:

delete[] secondValue;

я прав?

Ответы [ 3 ]

6 голосов
/ 20 ноября 2010

Есть две проблемы с тем, что вы написали:

  1. Вы не можете удалить char *value = "abcdefg";, так как он не размещен в куче. Чтобы выделить кучу памяти, вы используете new (в C ++) или malloc (в C).

  2. Когда вы выделяете память для строки, вам всегда нужен еще один дополнительный байт для нулевого завершения.

В вашем случае вы должны были сделать:

secondValue = new char[strlen(value)+1];

Кроме этого, вы правы

3 голосов
/ 20 ноября 2010

Если вы используете C ++, вы правы, за исключением того, что вам нужно сделать secondValue на один символ больше:

secondValue = new char[strlen(value) + 1];

Строки в стиле C заканчиваются символом '\0', что также требуетместо для хранения.

Если вы используете C вместо C ++, нет new или delete[], и вы должны использовать функции malloc() и free() вместо:

secondValue = malloc(strlen(value) + 1);
...
free(secondValue);

В любом случае обратите внимание, что в примере value является строковым литералом, который нельзя удалить / освободить.Вы должны только удалить / освободить то, что вы выделили с новым / malloc соответственно.

1 голос
/ 20 ноября 2010

То, как вы написали свой код:

char* value = "abcdefg";

Компилятор сгенерирует статическую строку "abcdefg", и value будет указателем на это.Вы можете назначить secondvalue = value, а затем иметь значение value go out of scope, and secondvalue`, которое все равно будет действительным.

В вашем примере нет другого способа освободить value.

...