删除指针时出错 我在运行一些C++代码时遇到了段错误。我已将问题隔离到程序中删除指针的一行。下面是一个产生相同错误的简单示例: int main() { int* pointer=0; int number = 3; pointer = &number; delete pointer;//This line causes a segmentation fault pointer=0; return 0; }
稍加修改即可生成可按预期工作的代码:删除指针时出错 我在运行一些C++代码时遇到了段错误。我已将问题隔离到程序中删除指针的一行。下面是一个产生相同错误的简单示例: int main() { int* pointer=0; int number = 3; pointer = &number; delete pointer;//This line causes a segmentation fault pointer=0; return 0; },c++,pointers,segmentation-fault,C++,Pointers,Segmentation Fault,稍加修改即可生成可按预期工作的代码: int main() { int* pointer=new int(3); delete pointer;//This line now works pointer=0; return 0; } 有人能解释为什么第一个会导致segfault而第二个不会吗?我知道指针不是无效的,因为它已被分配给数字变量的地址。您应该只删除分配给new的内存。堆栈上声明的自动变量不需要是deleted。通常,始终匹配内存分配和释放类型: 分配给new的内
int main()
{
int* pointer=new int(3);
delete pointer;//This line now works
pointer=0;
return 0;
}
有人能解释为什么第一个会导致segfault而第二个不会吗?我知道指针不是无效的,因为它已被分配给数字变量的地址。您应该只删除
分配给new
的内存。堆栈上声明的自动变量不需要是delete
d。通常,始终匹配内存分配和释放类型:
- 分配给
new
的内存应通过delete
解除分配
- 使用
new[]
分配的内存应通过delete[]
解除分配
- 使用
malloc()
分配的内存应使用free()
解除分配
segfault是因为delete
操作符将尝试将该内存放回堆中,这依赖于内存的某些属性,这些属性对于堆栈上的非源于堆的自动内存不适用。您不能对未使用new
获得的任何内容使用delete
。尝试这样做将导致未定义的行为。您的程序崩溃了,但可能发生了任何事情。当您删除未分配new
的指针时,您正在内存管理系统和堆栈之间创建冲突。每一个都将像它仍然拥有内存的唯一所有权一样运行,当它们覆盖彼此的值时,可能会导致崩溃。当您使用新的:
int *a=new int(4);
这个变量放在堆上,堆中包含所有分配的内存。
如果您声明了一个变量:
int a=4;
在堆栈中分配一个内存,其中有静态内存。
动态内存可以从用户处删除,但静态内存不能。
当YOU退出函数时,静态内存将自动释放:
void function()
{
int a;
}
当函数结束时,将自动解除分配(使用关键字“static”声明的变量除外)。
主函数中的变量也会自动释放。
因此,您不能对程序说取消分配堆栈中的变量。
在示例中,数字位于堆栈上,指针指向堆栈中的数字,如果删除它,则尝试删除堆栈中的变量,这是不允许的,因为它不是动态内存。对指针调用delete,解除分配指针指向的动态分配内存
在第一个程序中,指针指向一个静态分配的内存位置。变量号是一个“自动”变量,这意味着它的内存是自动管理的
另一方面,在第二个程序中,指针指向在堆段中分配的内存位置,需要通过调用delete手动解除分配
您可能会发现这很有用。第一个没有分配new
,因此在其上调用delete
从来都不是正确的做法。