在堆栈上创建一个指针

Create a pointer on the Stack

本文关键字:一个 指针 堆栈 创建      更新时间:2023-10-16

我正在学习c++,我有一个关于指针的问题。

我有这样的代码:

int* max = new int;
*max = 0;

我想,我在堆上创建了一个指针(如果我不对,请告诉我)。

一个问题:

是否有一种方法来创建一个初始化的指针与一个指令?(现在,我使用两个指令)。

另一个问题:

如何在堆栈上创建指针?

我看到这样的代码:

int myVar = 20;
int* pVar = &myVar;

我想我还没有在堆栈上创建一个指针,但我认为这是唯一的方法,不创建一个指针在堆上

我是c++开发的新手。

int* max = new int;

上面这行在堆栈上创建了一个指针,并用存储在堆上的整数初始化它。当表达式中涉及到new时,它将返回一个指向其动态创建的操作数的指针:

c++ 11标准第5.3.4/2段:

new -表达式创建的实体具有动态存储时间(3.7.4)。[——]如果实体是非数组对象,new-expression返回指向所创建对象的指针。如果是数组,则new -表达式返回指向数组初始元素的指针。

int myVar = 20;
int* pVar = &myVar;

在本例中,指针及其值都存储在堆栈中。赋值中没有涉及new表达式,因此在这种情况下不会在堆上创建任何内容。

如果想在一行中初始化指向对象的值,必须对进行值初始化,如下所示:

int* max = new int(5);

或者在c++ 11中你可以使用uniform-initialization:

int* max = new int{5};

同样重要的是,您要记住使用new创建的delete。由于内存是动态分配的,因此它的生命周期不依赖于创建它的作用域。如果您忘记delete,您的程序将获得内存泄漏。

delete max;

如果max是指向由new -表达式创建的数组的指针,则使用delete[]:

delete[] max;

注意:如果指针没有被new -表达式初始化,则不需要删除

通常建议您使用容器来管理内存。像std::unique_ptr这样的东西就可以。一旦它的析构函数被调用,它所保存的内存将被删除:

std::unique_ptr<int> max{new int{5}};

在c++ 14中有make_unique:

auto max = std::make_unique<int>(5);

指针是普通变量,其内容是一个内存地址。该内存可以是堆内存或堆栈内存。不要把指针和它所指向的内存空间搞混了。

第一个代码在堆上分配空间,堆可以容纳int类型。将指向该内存的指针存储在堆栈上。 第二段代码在栈上分配空间,可以容纳int类型。将指向该内存的指针存储在堆栈上。

所以两个指针都在堆栈上,但是只有第二个指针指向堆栈

在这两种情况下,分配的类型都是基本类型。默认情况下,基本类型不会初始化,除非您立即为其赋值(您的第二段代码),或者使用构造函数语法,该语法也适用于堆分配的值:

int *max = new int(0);
同样的语法可以在你的第二段代码中使用,顺便说一下:
int myVar(20);

如果你感兴趣的话:你也可以在堆上定义指针。int*是指向int s的指针类型,所以直接在堆上分配这种类型:

new int*();

这个表达式返回一个int**,然后您可以将其存储在某个地方。同样,您通常将这个指针对指针存储在堆栈上:

int **pointerToPointer = new int*();

int一样,可以在new-expression中将int*初始化为指向int的指针(这里是上面的max指针):

int **pointerToPointer = new int*(max);

现在你有两个指针具有相同的地址:max(堆栈上的指针)和使用pointerToPointer指向堆上的某个指针,即以下保持(I解引用' pointerToPointer,这导致存储在该指针后面的值,这是一个指向int的指针):

max == *pointerToPointer

是否有一种方法来创建一个初始化的指针与一个指令?

yes:

int * a = new int(20); //initialized with 20;

如何在堆栈上创建指针?

int myVar = 20;
int* pVar = &myVar;    //copied your code snipped It's alright

你的第一个例子

int* max = new int;
*max = 0;

确实在堆上创建了一个新的int类型,变量max保存了一个指向该int类型的指针。如果你打算使用这个,你将不得不使用delete max;,当你不再需要它,以避免内存泄漏。

第二个例子

int myVar = 20;
int* pVar = &myVar;

在堆栈上创建一个int型,pVar现在是一个指针,指向int型存储在内存中的地址。然而,如果你使用这个,你不必删除pVar,因为它不在堆上(你没有使用new关键字)。

这两个变量(在堆和堆栈上创建)之间的主要区别是堆栈变量在离开作用域时将被自动删除。作用域由花括号{}定义:

int* somefnc()
{
    int e1
    {
        int* e2 = new int(0);
        int e3 = 0;
    } // int e3 gets automatically deleted here
    return e2;
} // e1 gets automatically deleted here
// e2 still exists and has to be manually deleted.

指针的一个优点是在处理数组时。如果要在堆栈上创建x个元素的字符数组,则必须在编译时知道元素的数量。如果你想在运行时创建一个包含x个元素的字符数组,并且元素数量是动态的,你必须使用char* ar = new char[x];,然后通过ar[x-1] = 'n';访问它。


为了在堆上创建变量时初始化它,您可以使用var x = new var(args);

您可以将该值作为参数传递给堆初始化内存。

 int *iptr = new int(20);

初始值为20;

stack:包含本地变量。当你创建一个指针并用局部对象赋值它时。它指向堆栈中的变量。我们不是在堆上创建指针.