Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 删除char*崩溃程序_C++_Char - Fatal编程技术网

C++ 删除char*崩溃程序

C++ 删除char*崩溃程序,c++,char,C++,Char,为什么我的程序会崩溃?是否在堆栈上分配了char*str?因为删除[]任何您没有使用新[]分配的内容都是非法的。就这样 不,str并不指向堆栈上的某个内容,而是指向一个字符串文本,它是不可变的,通常位于只读段中。因为删除[]任何未使用新[]分配的内容是非法的。就这样 不,str不指向堆栈上的某个内容,而是指向一个字符串文本,它是不可变的,通常位于只读段中。您不能删除未分配给new的内容。此外,此字符串位于只读内存中,无法删除 要了解这一点,请尝试使用-S编译。例如 char* str = "he

为什么我的程序会崩溃?是否在堆栈上分配了char*str?

因为
删除[]
任何您没有使用
新[]
分配的内容都是非法的。就这样


不,
str
并不指向堆栈上的某个内容,而是指向一个字符串文本,它是不可变的,通常位于只读段中。

因为
删除[]
任何未使用
新[]
分配的内容是非法的。就这样


不,
str
不指向堆栈上的某个内容,而是指向一个字符串文本,它是不可变的,通常位于只读段中。

您不能
删除
未分配给
new
的内容。此外,此字符串位于只读内存中,无法删除

要了解这一点,请尝试使用-S编译。例如

char* str = "hello myname is Stack";
delete[] str;
当使用

// ex.c
int main(){
    const char * s = "hello my name is Stack";
}
您将得到一个文件
ex.s
,顶部包含以下内容:

gcc -S ex.c

正如您所看到的,字符串本身在程序集中,而不是在运行时分配。当程序运行时,文本驻留在只读内存(
.rodata
)中。

您不能
删除
未分配给
的内容。此外,此字符串位于只读内存中,无法删除

要了解这一点,请尝试使用-S编译。例如

char* str = "hello myname is Stack";
delete[] str;
当使用

// ex.c
int main(){
    const char * s = "hello my name is Stack";
}
您将得到一个文件
ex.s
,顶部包含以下内容:

gcc -S ex.c

正如您所看到的,字符串本身在程序集中,而不是在运行时分配。当程序运行时,文本驻留在只读内存(
.rodata
)中。

Luchian已经描述了这个问题,我想给出它崩溃的可能原因


堆将有一个存储的列表,列出它已经分配的内存块;当您调用
delete[]
时,它将尝试查找以前分配的内存块,并将该内存块返回到未分配的堆中。这将失败,因为您没有在堆上分配变量。由于找不到有效的内存位来释放它,它将尝试写入空指针并产生崩溃。

Luchian已经描述了这个问题,我想给出它崩溃的可能原因


堆将有一个存储的列表,列出它已经分配的内存块;当您调用
delete[]
时,它将尝试查找以前分配的内存块,并将该内存块返回到未分配的堆中。这将失败,因为您没有在堆上分配变量。找不到有效的内存位来释放内存,它将尝试写入空指针并导致崩溃。

Strings文本具有静态存储持续时间。您只能
delete[]
使用
new[]
分配的内容。仅仅因为它是指针并不意味着需要删除它。字符串文字具有静态存储持续时间。您只能
delete[]
使用
new[]
分配的内容。仅仅因为它是指针并不意味着需要删除它。因此它将在函数调用结束时自动删除str?@JavaNewb否,而不是字符串文字。字符串文字具有静态存储持续时间。它们将持续整个项目。为什么?因为它们必须存储在您的可执行文件中的某个地方,并且您的可执行文件被加载到内存中以执行。@JavaNewb
str
,是的,字符串本身-否。但是您不必担心它。否。该文本可能会在包含模块的整个生命周期中都很受欢迎。它不是内存的一部分吗?因此它将在函数调用结束时自动删除str?@JavaNewb否,不是字符串文本。字符串文字具有静态存储持续时间。它们将持续整个项目。为什么?因为它们必须存储在您的可执行文件中的某个地方,并且您的可执行文件被加载到内存中以执行。@JavaNewb
str
,是的,字符串本身-否。但是您不必担心它。否。该文本可能会在包含模块的整个生命周期中使用。它不是内存的一部分吗?字符串不在堆栈中。字符串不在堆栈中。