动态内存控制的优点是什么?
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;
那么,哪个更好呢?具有动态内存分配的堆栈有什么优势?在什么情况下我应该使用 first/second 变体?
两个堆栈都为其节点使用动态分配的内存(尽管 std::stack 它取决于底层容器)。
当然还是用标准的class比较好。它已经由合格的程序员测试和编写,并且足够灵活:您可以使用多个标准容器来实现堆栈,因为标准堆栈是一个容器适配器。
事实上,您可以为 std::stack 编写自己的底层容器,例如数组的包装器,在这种情况下,整个堆栈将被放置在堆栈内存中,尽管它的大小当然是固定的.:)
然而,标准堆栈也有很多缺点。例如,您不能使用 std::forward_list
作为底层容器。我提议为 std::forward_list
.
专门化标准 class std::stack
哪个更好肯定取决于用例。但通常我会建议您使用堆栈的 STL 实现,因为它被大量使用,因此经过完美测试。
此外,您将通过 STL 实现获得堆栈的完美抽象。
其次,STL实现也是使用动态内存分配,所以从这个角度来看,你的实现没有区别。
使用动态内存的好处是可以为您的程序添加可能的内存泄漏 and/or 分段错误。
我只在被迫时才使用动态内存。强制示例:使用使用 c 字符串作为参数和 return 值的库。
比如我想做一个栈。我可以这样做,使用动态内存控制,使用 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;
那么,哪个更好呢?具有动态内存分配的堆栈有什么优势?在什么情况下我应该使用 first/second 变体?
两个堆栈都为其节点使用动态分配的内存(尽管 std::stack 它取决于底层容器)。 当然还是用标准的class比较好。它已经由合格的程序员测试和编写,并且足够灵活:您可以使用多个标准容器来实现堆栈,因为标准堆栈是一个容器适配器。
事实上,您可以为 std::stack 编写自己的底层容器,例如数组的包装器,在这种情况下,整个堆栈将被放置在堆栈内存中,尽管它的大小当然是固定的.:)
然而,标准堆栈也有很多缺点。例如,您不能使用 std::forward_list
作为底层容器。我提议为 std::forward_list
.
std::stack
哪个更好肯定取决于用例。但通常我会建议您使用堆栈的 STL 实现,因为它被大量使用,因此经过完美测试。 此外,您将通过 STL 实现获得堆栈的完美抽象。 其次,STL实现也是使用动态内存分配,所以从这个角度来看,你的实现没有区别。
使用动态内存的好处是可以为您的程序添加可能的内存泄漏 and/or 分段错误。
我只在被迫时才使用动态内存。强制示例:使用使用 c 字符串作为参数和 return 值的库。