例如,我想制作一个堆栈。我可以这样做,使用动态记忆控制,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;
那么哪一个更好?具有动态内存分配的堆栈有什么优势?在什么情况下我应该使用第一个/第二个变体?
答案 0 :(得分:2)
两个堆栈都为其节点使用动态分配的内存(但对于std :: stack,它依赖于底层容器)。 当然最好使用标准类。它已由合格的程序员测试和编写,并且足够灵活:您可以使用多个标准容器来实现堆栈,因为标准堆栈是容器适配器。
实际上你可以为std :: stack编写自己的底层容器,例如一个数组的包装器,在这种情况下,整个堆栈将被放置在堆栈内存中,虽然它的大小当然会被修复。:)
然而,标准堆栈也有许多缺点。例如,您不能使用std::forward_list
作为基础容器。我提出了一项专门针对std::stack
的标准课std::forward_list
的建议。
答案 1 :(得分:1)
哪一个更好肯定取决于用例。但通常我建议你使用堆栈的STL实现,因为它被大量使用,因此测试完美。 此外,您将通过STL实现获得完美的堆栈抽象。 其次,STL实现也使用动态内存分配,因此从这个角度来看,实现没有区别。
答案 2 :(得分:1)
使用动态内存可以为程序添加可能的内存泄漏和/或分段错误。
强制使用时我只使用动态内存。强制示例:使用一个库,该库使用c-strings作为参数并返回值。