在 c++ 中声明变量与动态为变量分配内存
Declaring a variable vs dynamically assigning memory to a variable in c++?
我对我只声明一个变量时的区别有点困惑,例如:
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;
- 是否可以使用其他变量为变量分配值,而无需在 C++ 中更改其值?
- 将字符串变量分配给无符号字符变量
- 将延迟变量分配给引用变量
- 为什么以下变量分配不正确
- 如何在 c++ 中将两个不同类型的变量分配给一个变量
- C++ 无法将字符数组变量分配给字符串变量
- 直接为浮点变量分配十六进制整数与通过指针转换分配之间的区别
- 识别矩阵变量分配的行为
- C 为什么在原始双阵列中的分配似乎比双变量分配要快得多
- C++:如何将 char 变量分配给向量<char>并访问该向量的元素进行比较?
- 将局部方法变量分配给类指针
- 类构造函数中的静态成员变量分配
- 如果条件语句中的变量分配
- C++ - 将一个变量分配给另一个变量和将变量分配给引用变量有什么区别?
- 需要帮助了解指针变量分配
- 从值捕获的变量分配到lambda参数时,GCC编译器分割故障
- 将非按引用变量分配给返回按引用的函数,反之亦然
- 通过结构指针访问结构变量分配错误数据
- 分段故障(核心倾倒)变量分配
- 在名称空间之外的C 中的外部变量分配值