1. Если строка (например, «terry») не будет изменена где-либо в вашей программе, вы, безусловно, можете сделать
char* t = "terry";
и забыть о выделенной памятидля строки, поскольку она будет освобождена сама по себе.Однако, лучшая практика программирования для константных строк будет означать t
как const char*
следующим образом:
const char* t = "terry";
Но если это изменится, то это будет либо
char* t = new char[6];
strcpy(t, "terry");
или
char t[6];
strcpy(t, "terry");
В первом случае, когда используется оператор new
, вам потребуется освободить память, выделенную с помощью new
, после того как вам больше не нужна строка:
delete[] t;
Во втором случае память, лежащая в основе sting, будет автоматически освобождена, когда t
покинет область C ++ (фигурные скобки), в которой она была объявлена (но если t
является членом объекта, память будетосвобождается только тогда, когда объект разрушен).
2. После
char* t;
t = new char[6];
t = "terry";
t
действительно будет указывать на «махровый», но указатель / адресвам нужно освободить память, выделенную с помощью new
, потеряно навсегда.
3. Строковые нулевые терминаторы ('\ 0') аналогичны другим символам: они должны находиться где-тов памяти.Вы были достаточно мудры, чтобы выделить 6 байтов для «terry», длина которого составляет 5 символов: после
char* t = new char[6];
strcpy(t, "terry");
6-й байт блока памяти, на который указывает t
, содержит нулевой терминатор.Но
char* t;
не выделяет никакой памяти, кроме указателя t
.Итак, если вы хотите, чтобы строка содержала только нулевой терминатор (быть нулевой длины), вы можете сделать это следующим образом:
char* t = new char[1];
t[0] = '\0';