指针的范围?

num*_*l25 3 c++ visual-studio-2008 visual-studio visual-c++

好吧,所以我确实发现了一些几乎相似的问题,但实际上他们对指针更加困惑.

C++指针对象与非指针对象

在上面的链接中,他们说如果你声明一个指针它实际上保存在堆上而不是堆栈上,无论它在何处被声明.这是真的 ??还是我误会了?我认为无论指针还是非指针,如果它是一个全局变量,它就和应用程序一样长.如果它是一个局部变量或在循环或函数内声明,它的生命只与其中的代码一样长.

Ign*_*ams 9

变量本身存储在堆栈或DATA段中,但它在分配后指向的内存new位于堆内.

  • 好的,所以在本地范围内创建指针时.您在堆栈上创建指向堆上空间的内存.在范围的最后.堆栈上的内存被删除,堆上的内存仍然存在? (2认同)
  • 通过*smart pointer*,我们指的是一个指针,当它自身超出范围时,它会释放它指向的堆空间. (2认同)

Kor*_*icz 6

void main()
{
  int* p;          // p is stored on stack
  p = new int[20]; // 20 ints are stored on heap
}
// p no longer exists, but the 20 ints DO EXSIST!
Run Code Online (Sandbox Code Playgroud)

希望有所帮助.


Mic*_*yan 5

需要区分指针(保存内存位置的变量)和指针指向的对象(指针保存的内存地址处的对象)。指针可以指向堆栈或堆上的对象。如果使用new来分配对象,它将在堆上。同样,指针可以存在于堆上。如果您在函数体中声明它,那么它将是一个局部变量并存在于本地存储中(即在堆栈上),而如果它是一个全局变量,它将存在于应用程序数据部分的某个位置。您还可以拥有指向指针的指针,类似地,可以在堆上分配一个指针(并有一个指向该指针的指针)等。请注意,虽然我引用了堆和堆栈,但仅在 C++ 中提到本地/自动存储和动态存储......它没有谈到实现。但实际上,local=stack 和dynamic=heap。

  • 只是一个建议,您可以尝试将答案分成更少的文本片段。:) (2认同)

Nik*_*chi 5

void func()
{
  int x = 1;
  int *p = &x;
}
// p goes out of scope, so does the memory it points to

void func()
{
  int *p = new int;
}
// p goes out of scope, the memory it points to DOES NOT

void func()
{
  int x = 1;
  int **pp = new int*;
  *pp = &x;
}
// pp goes out of scope, the pointer it points to does not, the memory it points to does
Run Code Online (Sandbox Code Playgroud)

等等。指针是包含内存位置的变量。像所有变量一样,它可以在堆或堆栈上,具体取决于它的声明方式。它的值——内存位置——也可以存在于堆或栈中。

通常,如果你静态分配一些东西,它就在堆栈上。如果你动态分配一些东西(使用 new 或 malloc),那么它就在堆上。一般来说,您只能使用指针访问动态分配的内存。这可能是混淆出现的地方。