const char *是用C ++编写的

时间:2010-01-04 18:32:05

标签: c++ string

C ++中的字符串表达式如何工作?

考虑:

#include <iostream>
using namespace std;

int main(int argc, char *argv[]){

    const char *tmp="hey";
    delete [] tmp;

    return 0;
}

“hey”表达式存储在何处以及如何存储,以及当我尝试删除它时为什么会出现分段错误?

9 个答案:

答案 0 :(得分:18)

存储的位置留给编译器来决定这个(有点特殊)的情况。但是,它对你来说并不重要 - 如果你不用new分配内存,尝试用delete解除分配它并不是很好。您不能以分配方式分配delete内存。

如果要控制该资源的释放,则应使用std::string,或使用malloc()分配缓冲区。

答案 1 :(得分:16)

当您在示例中为const char *这样的常量字符串分配"hey"指针时,hey\0序列将作为静态变量存储在二进制文件本身内。它不能删除,也不应该被操纵。根据体系结构/操作系统的不同,在操作时可能会出现段错误

如果你要做const char[] tmp = "hey",那么数据将被存储在堆栈中,并且可能被操纵(但不会被删除,因为一旦堆栈清除它将被释放:当函数返回时)。

不要delete[]任何不是new[]'的东西。

答案 2 :(得分:10)

"hey"是字符串文字,存储在可执行文件的数据段中,在加载时映射到进程的内存中。文字所在的特定部分被映射为只读。以下是使用g++ -S代码生成的程序集片段:


...
    .section    .rodata
.LC0:
    .string "hey"
    .text
    .align 2
...

因此数据确实是只读,并尝试使用delete操纵它会导致段错误。

答案 3 :(得分:5)

const char *tmp="hey";

“嘿”存储在read-only area of the Data Segment中。 当应用程序启动时,“hey”将映射到READ-ONLY内存页面。

const char *tmp="hey";
delete [] tmp;

deleteaccess and change some allocation metadata., 但是“只读”内存页面中的“嘿”。

不允许在READ-ONLY中更改值so segmentation fault happened

答案 4 :(得分:4)

您无法删除静态资源:这些资源是只读的。

答案 5 :(得分:4)

这是怎么回事。

"hey"表示将字符串'hey'放到某处的二进制图像中并给我一个地址,这是表达式的值(“嘿”)。它有char *类型。在这个地址,你有4个字节。 'h','e','y'和0(0称为传统的空终止符。(与电影终结符无关)这是字符串文字在C中的工作方式。

你可以这样传递这个文字:“一个字符串的地址”。

您无法将其删除。

当你构造std :: string(“hey”)时,它接受这个指向的字符串,并将其复制到其他地方 - 进入新分配的内存。

答案 6 :(得分:1)

您无法删除常量数据。如果您之前曾致电delete[] tmp,则只能致电new char[stringSize]

答案 7 :(得分:1)

您没有在字符串上调用new。无论如何,这是潜在的内存泄漏,每newdeletemallocfree同样相同。你删除了一个指针的内存引用,就像单词而言,simple是一个静态的chars数组。

希望这有帮助, 最好的祝福, 汤姆。

答案 8 :(得分:0)

字符串"hey"预先分配了空间作为程序的一部分,因此它只在程序启动时出现,在程序结束时消失。

如果你想看一个分配内存的程序,使用它,然后将其删除,然后看看:

#include <iostream>
using namespace std;

int main(int argc, char *argv[]){

    const char *hey="hey";
    char* tmp=new char[4]; // NB allocate 4 chars for "hey" plus a null terminator
    strcpy(tmp,hey);  // copies the string and null terminator
    cout << tmp << endl;
    delete [] tmp;
    // must not use tmp now as it points to deallocated memory
    // must not delete hey

    return 0;
}

注意我是如何使用new删除tmp'内存的。我本可以做到这一点:

    cout << tmp << endl;
    hey = tmp;
    delete [] hey;

最后,我们是否指向newhey tmp的内存并不重要,只要我们正确删除它以避免记忆泄漏。