动态内存控制的优势是什么
What is the advantage of dynamic memory control?
例如,我想做一个堆栈。我可以以这种方式做到这一点,使用动态内存控件,使用new
和delete
操作:
#include <iostream>
using namespace std;
struct List
{
int x;
List *Next,*Head;
};
void Add(int x, List *&MyList)
{
List *temp=new List;
temp->x=x;
temp->Next=MyList->Head;
MyList->Head=temp;
}
void Show(List *MyList)
{
List *temp=MyList->Head;
while (temp!=NULL)
{
cout<<temp->x<<" ";
temp=temp->Next;
}
}
void ClearList(List *MyList)
{
while (MyList->Head!=NULL)
{
List *temp=MyList->Head->Next;
delete MyList->Head;
MyList->Head=temp;
}
}
int main()
{
List *MyList=new List;
MyList->Head=NULL;
for (int i=0;i<10;i++) Add(i,MyList);
Show(MyList);
ClearList(MyList);
delete MyList->Head;
delete MyList;
}
而且我可以用这种方式制作一个堆栈并用它做任何事情:
std::stack<int> MyStack;
那么,哪一个更好呢?具有动态内存分配的堆栈的优势是什么?在什么情况下我应该使用第一个/第二个变体?
这两个堆栈都为其节点使用动态分配的内存(尽管对于 std::stack 它取决于底层容器)。当然最好使用标准类。它已经由合格的程序员测试和编写,并且足够灵活:您可以使用多个标准容器来实现堆栈,因为标准堆栈是容器适配器。
事实上,你可以为 std::stack 编写自己的底层容器,例如围绕数组的包装器,在这种情况下,整个堆栈将被放置在堆栈内存中,尽管它的大小当然是固定的:)
然而,标准堆栈也有很多缺点。例如,不能将std::forward_list
用作基础容器。我提出了一个建议,专门为std::forward_list
提供标准类std::stack
。
哪一个更好肯定取决于用例。但一般来说,我建议您使用堆栈的 STL 实现,因为它被大量使用,因此经过完美测试。此外,您将通过 STL 实现获得堆栈的完美抽象。其次,STL 实现也使用动态内存分配,因此从这个角度来看,您的实现没有区别。
使用动态内存的优点是可以向程序添加可能的内存泄漏和/或分段错误。
我只在被迫时才使用动态内存。强制示例:使用使用 c 字符串作为参数和返回值的库。
相关文章:
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 使用共享指针时,从共享指针本身释放内存的机制是什么
- 具有相同特征的两个对象是否只在内存中存储一次?无论定义它们的函数是什么,都是不同的
- 删除类成员的动态分配内存的最佳方法是什么
- 我在 2D 数组的动态内存分配中遇到了一些奇怪的代码C++? 请解释一下这是什么?
- 释放 std::vector 中指针内存的最有效方法是什么?
- 释放分配给大量矢量的内存的最有效方法是什么?
- 内存中的值是什么?
- 将内存分配给 2D 数组时,“new int*[rowCount];”的含义是什么?是 2D 数组,是指向数组的指针数组
- 为循环中多次调用的函数返回值预分配内存的正确方法是什么
- 使用 CFFI 释放内存时"MemoryError: Stack overflow"是什么意思?
- 函数不受主内存约束的函数所需的复杂性是什么?
- 当某些错误可以接受时,顺序加载存储原子的内存顺序应该是什么
- 获取释放内存顺序与顺序一致性不同的实际示例是什么?
- 数组向量的内存布局是什么
- 跳过的内存地址是什么?
- C/C++ 三维数组如何在内存中存储,以及遍历它的最快方法是什么
- 在内存使用或编译时间方面更好的是什么
- 在Windows上打开文件的内存开销是什么?
- 内存泄漏的长期后果是什么?