为什么运算符"new"需要指针才能工作?
Why does operator "new" require a pointer to work?
我无法理解为什么通过new
分配的堆栈中的内存只能通过指针访问,而堆中的内存(静态分配(可以正常访问。
这是否与堆中几乎所有内存都有某种顺序并且堆栈中的内存有些随机这一事实有关?(如果我刚才说的是真的。
动态记忆对我来说似乎如此模糊和神秘,所以任何能帮助我更好地理解它的人都会受到极大的赞赏。
为什么运算符"new"需要指针才能工作?
因为它在heap
上分配内存块(大小由调用方指定(,并返回该分配块的开头address
。
我们为什么要使用它
-
如果我们想要临时内存,我们正在使用它,因此我们可以轻松
delete[]
它。 -
您可以轻松更改分配内存的大小(调整大小(。
char arr[20]; // You need more space? Not possible to change size // While char * arr = new char[20]; delete[] arr; arr = new char[50];
缺点
-
使用
new
分配对象要昂贵得多。 -
它更慢。
-
内存泄漏的
-
内存碎片
-
必须是免费的
delete[]
总结
Stack
(automatic storage
(更容易使用,更快,万无一失。但有时我们必须使用heap
,我们应该尽可能小心。
看,在C++中,内存分为四个部分,即
- 程序代码
- 全局变量
- 叠
- 堆
现在,顾名思义,程序代码部分存储您的代码,全局变量部分存储全局变量。 这两部分非常清楚。
现在,我们关注的是堆栈内存和堆内存。
堆栈内存是为静态实现保留的。
堆内存是为动态实现保留的。
堆栈内存中的变量在编译期间分配。 但是堆内存中的变量是在运行时分配的,因为它在运行时分配,我们不能将其作为普通变量进行处理。
在这里,我们需要指针,因为我们需要一些东西来引用我们在动态分配期间获得的内存。这项工作由指针完成。
相关文章:
- 对象指针在c++中是如何工作的
- 将返回值存储在函数指针数组的指针中是如何工作的?
- 为什么指针在对二维数组进行排序时无法正常工作?
- 为什么 C 样式字符串的工作空指针检查不?
- 像自定义类一样构造的指针(内置类型)如何工作?
- 为什么通过定义另一个指针单元格,整个代码停止工作?
- 在不工作的情况下为数组分配指针,但反过来也可以
- std::function是如何使指向成员函数的指针工作的
- 为什么运算符"new"需要指针才能工作?
- 当删除 [] 指针工作时,为什么无法获得指向的数组大小?
- For 循环使用指针遍历数组无法正常工作
- 指向C++中成员的指针如何在内部工作?
- 我可以更改将引用参数传递到指针中并使其正常工作的函数的输入(C、C++)吗?
- C++指向成员的指针的类内初始化会使 MSVC 失败(但 GCC/Clang 工作)
- 你不能在 void 指针上使用指针算法,那么 void 指针数组是如何工作的呢?
- 指向成员函数的指针如何工作
- 返回指针的语句 - 解释它是如何工作的以及为什么
- 指向成员结构的指针如何工作
- Malloc,免费和多个指针,它是如何工作的
- 函数指针仅在 main 内部工作