我假设char* = "string"
与char* = new char[6]
相同。我相信这些字符串是在堆而不是堆栈上创建的。那么当我完成使用它们或者它们被自己毁坏时,我是否需要销毁它们或者释放它们的记忆?是否需要销毁char * =“string”或char * = new char [6]?
14
A
回答
31
不需要。当您使用malloc
函数(在C中)或new
运算符(在C++中)手动分配内存时,只需手动释放字符串。如果您不使用malloc
或new
,那么char*
或字符串将在堆栈上创建或作为编译时常量。
1
您不知道字符串文字的存储位置。甚至可以只读存储器,因此您的代码应阅读:
const char* c = "string";
而一个新字符数组应该是删除ð就像任何其他的动态分配的内存区域。
4
它们不一样。你的第一个例子是一个常量字符串,所以它绝对不是从堆中分配的。你的第二个例子是6个字符的运行时内存分配,并且来自堆。你不想删除你的第一个例子,但你需要delete []
你的第二个例子。
4
我假设我在做
char* = "string"
其作用与char* = new char[6]
一样。
不是。第一个做的是创建一个常量。修改它是未定义的行为。但要回答你的问题;不,你不必摧毁它们。只需要说明,请尽可能使用std::string
。
0
新始终是一个分配,而定义一个字符串内嵌实际上嵌入数据在程序本身,不能改变(一些编译器允许这个聪明的把戏,不要打扰)。
某些编译器键入内联字符串,以便您不能修改缓冲区。
char* const sz1 = "string"; // embedded string, immutable buffer
char* sz2 = new char[10]; // allocated string, should be deleted
17
号当你说:
const char* c = "Hello World!";
你是一个 “预先存在的” 字符串常量,这是不一样的分配C:
char* c = new char[6];
只有在后一种情况是你在堆上分配内存。所以,当你完成后你会打电话给delete。
3
游戏的名称是“只破坏你创造的东西”。下面是对:
malloc
/free
calloc
/free
new
/delete
new []
/delete []
既然您已使用new []
第二串,有责任你用销毁它210。完成后致电delete [] string2
。
现在,如果您的代码错综复杂并且难以跟踪删除操作,请考虑使用范围指针或自动指针。 boost库中的boost::scoped_ptr
类是开始的好地方。也看看RAII成语,非常方便和有用的东西。
0
让我们来看看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);
}
编译和反编译:
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. String.Replace(char,char)或Replace(string,string)?
- 2. char * t = new char和char * t = new char [10]有什么不同?
- 3. char *为char [] - 是否有必要?
- 4. 在C++中,“char * string []”是否等同于“char ** string”?
- 5. std :: string gets(char *)而不是(const char *)
- 6. “new char []”是否需要手动释放资源?
- 7. char to string error
- 8. ctype.h是否仍然需要unsigned char?
- 9. 在C++中使用<string,string>或<string,char>映射而不是<char, char>
- 10. C++ string/char * concatenation
- 11. String.Replace char to string
- 12. Objective-C:initWithName:(char *)string
- 13. char!=(signed char),char!=(unsigned char)
- 14. C++ new/delete和char *
- 15. QByteArray转换为char(不是char *或constChar *)
- 16. 是否可以用char和&mut char来比较char?
- 17. String Char迭代器
- 18. NSString为char(不是const char)
- 19. C++ char ** - > vector <string> - > string - > char **解析问题
- 20. Java为什么char = char^char与char^= char不同?
- 21. char * p = NULL需要内存?
- 22. LWPSTR CONST CHAR *需要帮助
- 23. ctypes char *需要的指针
- 24. char *到char [200]
- 25. char **转为char *
- 26. Char到char * C++
- 27. `const char *'到`char'
- 28. const char * const char **
- 29. concat char * char charbebe
- 30. C++ char const char *
“新”从堆中分配内存,从不从堆栈中分配内存。 (当然,除非你重写了新的操作符。) – 2008-09-09 11:07:07