动态内存控制的优势是什么

What is the advantage of dynamic memory control?

本文关键字:是什么 内存 控制 动态      更新时间:2023-10-16

例如,我想做一个堆栈。我可以以这种方式做到这一点,使用动态内存控件,使用newdelete操作:

#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 字符串作为参数和返回值的库。