动态内存控制的优点是什么?

What is the advantage of dynamic memory control?

比如我想做一个栈。我可以这样做,使用动态内存控制,使用 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;

那么,哪个更好呢?具有动态内存分配的堆栈有什么优势?在什么情况下我应该使用 first/second 变体?

两个堆栈都为其节点使用动态分配的内存(尽管 std::stack 它取决于底层容器)。 当然还是用标准的class比较好。它已经由合格的程序员测试和编写,并且足够灵活:您可以使用多个标准容器来实现堆栈,因为标准堆栈是一个容器适配器。

事实上,您可以为 std::stack 编写自己的底层容器,例如数组的包装器,在这种情况下,整个堆栈将被放置在堆栈内存中,尽管它的大小当然是固定的.:)

然而,标准堆栈也有很多缺点。例如,您不能使用 std::forward_list 作为底层容器。我提议为 std::forward_list.

专门化标准 class std::stack

哪个更好肯定取决于用例。但通常我会建议您使用堆栈的 STL 实现,因为它被大量使用,因此经过完美测试。 此外,您将通过 STL 实现获得堆栈的完美抽象。 其次,STL实现也是使用动态内存分配,所以从这个角度来看,你的实现没有区别。

使用动态内存的好处是可以为您的程序添加可能的内存泄漏 and/or 分段错误。

我只在被迫时才使用动态内存。强制示例:使用使用 c 字符串作为参数和 return 值的库。