删除指针时出错 我在运行一些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
从来都不是正确的做法。