-4

C++ の初心者として、New を使用する理由と場所を学ぼうとしています。したがって、このリンクされたリストの例では New を使用しないようにしています。

////////////////////////////////////////////////////////////////
struct link //one element of list
{
    int data; //data item
    link* next; //pointer to next link
};
////////////////////////////////////////////////////////////////
class linklist //a list of links
{
private:
    link* first; //pointer to first link
public:
    linklist() //no-argument constructor
    { first = NULL; } //no first link
    void additem(int d); //add data item (one link)
    void display(); //display all links
};
//--------------------------------------------------------------
void linklist::additem(int d) //add data item
{
    link* newlink = new link; //make a new link
    newlink->data = d; //give it data
    newlink->next = first; //it points to next link
    first = newlink; //now first points to this
}
//--------------------------------------------------------------
void linklist::display() //display all links
{
    link* current = first; //set ptr to first link
    while( current != NULL ) //quit on last link
    {
        cout << current->data << endl; //print data
        current = current->next; //move to next link
    }
}
////////////////////////////////////////////////////////////////
int main()
{
    linklist li; //make linked list
    li.additem(25); //add four items to list
    li.additem(36);
    li.additem(49);
    li.additem(64);

    return 0;
}

以下に:

 ////////////////////////////////////////////////////////////////
struct link //one element of list
{
    int data; //data item
    link* next; //pointer to next link
};
////////////////////////////////////////////////////////////////
class linklist //a list of links
{
private:
    link first; //pointer to first link
public:
    linklist() //no-argument constructor
    { first = NULL; } //no first link
    void additem(int d); //add data item (one link)
    void display(); //display all links
};
//--------------------------------------------------------------
void linklist::additem(int d) //add data item
{
    link newlink; //make a new link
    newlink.data = d; //give it data
    newlink.next = first; //it points to next link
    first = newlink; //now first points to this
}
//--------------------------------------------------------------
void linklist::display() //display all links
{
    link current = first; //set ptr to first link
    while( current != NULL ) //quit on last link
    {
        cout << current.data << endl; //print data
        current = current.next; //move to next link
    }
}
////////////////////////////////////////////////////////////////
int main()
{
    linklist li; //make linked list
    li.additem(25); //add four items to list
    li.additem(36);
    li.additem(49);
    li.additem(64);
    return 0;
}

しかし、これは機能しません。試行を続ける前に、この特定の例は New に固執する必要があり、New を使用しないと実行できないのではないかと考えています。

4

6 に答える 6

2

スタックメモリとヒープメモリを理解していないと思います。あなたがしなければならないことは、「動的割り当て」と呼ばれます。

link newlink; 変数をスタック上でのみ作成するように定義すると、関数を終了すると存在しなくなり、「割り当て解除」されます。そのリストに必要なのは、関数の終了時に割り当て解除されない新しいメモリ領域を要求することです。そのためには、動的割り当てを使用する必要があります。その手段の 1 つがnewオペレーターです。もう 1 つの標準的な方法は、malloc 関数です。

TL;DR 思い通りにできません。C\C++ でメモリがどのように機能するかを誤解しているようです。ポインターと動的割り当てを使用する必要があるため、動的リンクリストと呼ばれます。

また、 std:list を質問として使用しないでください。コードの記述方法は、リンクされたリストの実装が一種の宿題であることを示しています。他の人の実装を実行する前に、基本的な機能を理解することを学びます。

于 2013-06-10T16:40:28.640 に答える
0

リンクされたリストは、本質的に、個々の動的に割り当てられたブロックのコレクションであるためnew 、クライアント コードに公開されるかどうかに関係なく要件です。@Alokが示唆するように、std::listこのメモリ割り当てをカプセル化し、リークが発生しないようにするため、 a が望ましいです。スタックに割り当てようとnewLinkすると、そのアドレスを取得しない限りコンパイルに失敗します。newLink関数が戻るとすぐにスタックからポップされます) 。

于 2013-06-10T16:39:50.397 に答える
0

あなたが言う時

link newlink; //make a new link

関数の終わりまでに範囲外になるリンクをスタックに作成しました。

newを避けるのではなく、「生のポインタを避ける」というルールを使用する必要があると思います。代わりに std::make_shared を使用し、生のポインターの代わりに std::unique_ptr を保持すると、学習に役立つ可能性があります。

于 2013-06-10T16:54:58.730 に答える