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

时间:2015-03-07 14:22:21

标签: c++ memory dynamic stack difference

例如,我想制作一个堆栈。我可以这样做,使用动态记忆控制,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;

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

3 个答案:

答案 0 :(得分:2)

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

实际上你可以为std :: stack编写自己的底层容器,例如一个数组的包装器,在这种情况下,整个堆栈将被放置在堆栈内存中,虽然它的大小当然会被修复。:)

然而,标准堆栈也有许多缺点。例如,您不能使用std::forward_list作为基础容器。我提出了一项专门针对std::stack的标准课std::forward_list的建议。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

使用动态内存可以为程序添加可能的内存泄漏和/或分段错误。

强制使用时我只使用动态内存。强制示例:使用一个库,该库使用c-strings作为参数并返回值。