2008-09-09 63 views

回答

31

不需要。当您使用malloc函数(在C中)或new运算符(在C++中)手动分配内存时,只需手动释放字符串。如果您不使用mallocnew,那么char*或字符串将在堆栈上创建或作为编译时常量。

1

您不知道字符串文字的存储位置。甚至可以只读存储器,因此您的代码应阅读:

const char* c = "string"; 

而一个字符数组应该是删除ð就像任何其他的动态分配的内存区域。

4

它们不一样。你的第一个例子是一个常量字符串,所以它绝对不是从堆中分配的。你的第二个例子是6个字符的运行时内存分配,并且来自堆。你不想删除你的第一个例子,但你需要delete []你的第二个例子。

+1

“新”从堆中分配内存,从不从堆栈中分配内存。 (当然,除非你重写了新的操作符。) – 2008-09-09 11:07:07

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

游戏的名称是“只破坏你创造的东西”。下面是对:

  1. malloc/free
  2. calloc/free
  3. new/delete
  4. 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[]的输出。所以你应该尽可能地释放它。