删除指针时的Segfault

rno*_*ris 2 c++ pointers segmentation-fault

我在运行一些C++代码时遇到了段错误.我已将问题隔离到程序中删除指针的行.这是一个产生相同错误的简单示例:

int main()
{
  int* pointer=0;
  int number = 3;

  pointer = &number;
  delete pointer;//This line causes a segmentation fault
  pointer=0;

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

稍作修改就会生成符合预期的代码:

int main()
{
  int* pointer=new int(3);

  delete pointer;//This line now works
  pointer=0;

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么第一个导致段错误而第二个没有?我知道指针不是无效的,因为它已被赋值给数字变量的地址.

Cha*_*had 18

你应该只有delete已经分配的内存new.在堆栈上声明的自动变量不需要是deleted.通常,始终匹配内存分配和释放类型:

  • 分配的内存new应该被释放delete.
  • 分配的内存new []应该被释放delete [].
  • 分配的内存malloc()应该被释放free().

segfault是因为delete操作符将尝试将该内存放回堆中,并且依赖于内存的某些属性,这些属性不适用于堆栈上不是来自堆的自动内存.