C ++中的字符串表达式如何工作?
考虑:
#include <iostream>
using namespace std;
int main(int argc, char *argv[]){
const char *tmp="hey";
delete [] tmp;
return 0;
}
“hey”表达式存储在何处以及如何存储,以及当我尝试删除它时为什么会出现分段错误?
答案 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;
delete
将access 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
。无论如何,这是潜在的内存泄漏,每new
个delete
,malloc
和free
同样相同。你删除了一个指针的内存引用,就像单词而言,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;
最后,我们是否指向new
或hey
tmp
的内存并不重要,只要我们正确删除它以避免记忆泄漏。