Я предполагаю, что char* = "string"
то же самое для char* = new char[6]
. Я считаю, что эти строки создаются в куче вместо стека. Так что мне нужно уничтожить их или освободить их память, когда я закончил использовать их или они сами уничтожаются?Нужно ли уничтожать char * = "string" или char * = new char [6]?
ответ
Нет. Вам нужно только вручную освобождать строки, когда вы вручную распределяете память самостоятельно, используя функцию malloc
(в C) или оператор new
(на C++). Если вы не используете malloc
или new
, тоили строка будет создана в стеке или как константа времени компиляции.
Вы не знаете, где хранятся строковые литералы. Он даже может быть только для чтения памяти, так что ваш код должен прочитать:
const char* c = "string";
И новый массив символ должен быть удалить d так же, как и любой другой динамически распределяемой области памяти.
Это не то же самое. Ваш первый пример - постоянная строка, поэтому он определенно не выделяется из кучи. Второй пример - выделение памяти времени выполнения из 6 символов, и это происходит из кучи. Вы не хотите удалять свой первый пример, но вам нужен delete []
ваш второй пример.
Я принимаю, когда я делаю
char* = "string"
его то же самое, что иchar* = new char[6]
.
Нет. Что делает первый, это создать константу. Модификация - неопределенное поведение. Но чтобы ответить на ваш вопрос; нет, вам не нужно их уничтожать. И просто примечание, всегда используйте std::string
, когда это возможно.
новое всегда является распределением, тогда как определение строки inline фактически внедряет данные в самой программе и не может быть изменено (некоторые компиляторы позволяют это с помощью умного трюка, не беспокойтесь).
Некоторые компиляторы строят строки, чтобы вы не могли изменить буфер.
char* const sz1 = "string"; // embedded string, immutable buffer
char* sz2 = new char[10]; // allocated string, should be deleted
Нет. Когда вы говорите:
const char* c = "Hello World!";
Вы назначаете С к «предварительно существующей» строковой константе, которая не является такой же, как:
char* c = new char[6];
только в В последнем случае вы выделяете память в кучу. Таким образом, вы будете называть delete, когда закончите.
Название игры «уничтожить только то, что вы создали».Вот пары:
malloc
/free
calloc
/free
new
/delete
new []
/delete []
Поскольку вы создали 2-ю строку, используя new []
, бремя ответственности является на вас, чтобы уничтожить его с помощью delete []
. Позвоните по телефону delete [] string2
, когда закончите.
Теперь, если ваш код достаточно сложный и затрудняет отслеживание удалений, рассмотрите использование указателей с областью или автоматических указателей. Класс boost::scoped_ptr
из библиотеки boost - это хорошее место для начала. Также обратите внимание на идиому RAII, довольно удобный и полезный материал.
Давайте посмотрим, что делает GCC 4.8 x86-64 Linux
Программа:
#include <cstdio>
int main() {
const char *s = "abc";
char *sn = new char[4];
sn[3] = '\0';
std::printf("%s\n", s);
std::printf("%s\n", sn);
}
Compile и декомпилировать:
g++ -ggdb -std=c++98 a.cpp
objdump -CSr a.o
Выход содержит:
const char *s = "abc";
8: 48 c7 45 f0 00 00 00 movq $0x0,-0x10(%rbp)
f: 00
c: R_X86_64_32S .rodata
char *sn = new char[4];
10: bf 04 00 00 00 mov $0x4,%edi
15: e8 00 00 00 00 callq 1a <main+0x1a>
16: R_X86_64_PC32 operator new[](unsigned long)-0x4
1a: 48 89 45 f8 mov %rax,-0x8(%rbp)
Интерпретация:
char *s = "abc"
переходит в.rodata
. Так что вы не можете это сделатьfree
.char *sn = new char[4];
имеет выходoperator new[]
. Поэтому вы должны освободить его, когда сможете.
- 1. Char или String?
- 2. преобразование char ** в char * или char
- 3. то, что отличается от char * t = new char и char * t = new char [10];
- 4. Разница между char * s = new char [] и char s [20]?
- 5. Что имеет смысл - char * string или char * string?
- 6. LINQ Select on string results char char
- 7. (const char *) ++ или (const char) ++?
- 8. Java Почему char = char^char отличается от char^= char?
- 9. Есть ли у Android лимит Char Char для String?
- 10. can not cout string только char char
- 11. std :: string get (char *) вместо (const char *)
- 12. String.Replace (char, char) или Replace (строка, строка)?
- 13. char + char = int? Зачем?
- 14. Копирование динамически выделенного символа char * string в новый char * string
- 15. String to char to string
- 16. Сравните char [] и char *
- 17. char to string error
- 18. Понятие char char
- 19. Разница между char * str = "STRING" и char str [] = "STRING"?
- 20. std :: string vs. char *
- 21. Устранение Char из String
- 22. char * to string literal?
- 23. Подсчет char в String
- 24. Производительность char vs string
- 25. Lua String char encoding
- 26. C char [] и * char
- 27. C++ vector char char
- 28. Использование char * или char [] в структуре C++
- 29. Разница между char a [] = "string"; char * p = "string";
- 30. `const char * 'to` char'
«новый» выделяет память из кучи, никогда из стека. (Если, конечно, вы не переопределили нового оператора.) – 2008-09-09 11:07:07