在 c++ 中声明变量与动态为变量分配内存

Declaring a variable vs dynamically assigning memory to a variable in c++?

本文关键字:变量 分配 内存 动态 声明 c++      更新时间:2023-10-16

我对我只声明一个变量时的区别有点困惑,例如:

int n;

并使用"new"将内存动态分配给变量,例如:

int m = new int;
我注意到,当我以节点对象

的形式插入一个新值时,我必须动态创建一个新的节点对象并将所需的值附加到它,然后将其链接到列表的其余部分。然而。。在同一个函数中,我可以定义另一个节点对象,例如 NodeType *N. 并使用此指针遍历我的列表。我的问题是..当我们只是声明一个变量时,内存不会立即被分配吗?或者有什么区别?

谢谢!

尽可能首选自动存储分配变量:

int n;

int* m = new int; // note pointer

在您的情况下首选动态分配的原因是链表的定义方式。 即每个节点都包含一个指向下一个节点的指针(可能)。由于节点必须存在于创建节点的位置之外,因此它们是动态分配的。

节点类型 *N. 并使用此指针遍历我的列表

是的,你可以这样做。但请注意,这只是一个指针声明。您必须将其分配给有意义的东西才能实际使用它。

我的问题是..当我们只是声明一个变量时,内存不会立即被分配......或者有什么区别?

实际上,这两种情况都是定义,而不仅仅是声明。

int n;

创建具有自动存储的未初始化int;

int* n;

创建指向int 的指针。它悬而未决,它不指向有效的内存位置。

int* n = new int;

创建一个指针并将其初始化为包含未初始化int的有效内存位置。

int* n = new int();

创建一个指针并将其初始化为包含值初始化int的有效内存位置(即 0)。

不同之处在于,只有当编译器可以在编译时确定需要多少内存以及需要多长时间时,才能使用自动存储。 通常,自动变量将在堆栈上分配。

而对于动态分配的内存,程序员负责跟踪此信息。 这通常在堆上分配。 由于各种原因,使用堆内存通常会产生更大的开销,并且存在内存泄漏的风险,即您分配堆内存但从不释放它。

在您描述的链表示例中,您不太可能在编译时知道列表的长度(如果您知道,那么您可以使用静态数组),因此这就是为什么您需要显式管理内存而不是让编译器自动处理内存管理。 但是,在函数返回后,不需要用于遍历列表的指针,因此这就是编译器可以自动管理它的原因。

int m = new int; 

实际上是不正确的。 new返回指向其创建的内存的指针。它应该是

int *m = new int;

甚至更好:

int *m = new int();

它设置由 m = 0 指向的变量的初始值。

此外,关于您的问题,通常使用指针创建大型对象,以消除按值从一个函数传递到另一个函数的大型复制操作。当需要变量的生存期比函数的作用域长时,也会使用它们。

但是,对于函数范围中使用的变量,并且在其他任何地方都没有用,应使用自动内存

int m;