0

コードは次のとおりです。

#include "DynIntStack.h"


DynIntStack::DynIntStack(void)
{
}


DynIntStack::~DynIntStack(void)
{
}

bool DynIntStack::IsEmpty()
{
    return head;
}
void DynIntStack::Push(int v)
{
    Element e = Element(v, head);
    head = &e;
}
int DynIntStack::Pop()
{
    if(head)
    {
        int r = head->v;
        head = head->next;
        return r;
    }
}
int DynIntStack::Top()
{
    if(head)
        return head->v;
}
string DynIntStack::Print()
{
    stringstream ss;
    ss << "IntStack {";
    Element *k = head;
    while (k)
    {
        ss << k->v << ", ";
        k = k->next;
    }
    ss << "}";
    return ss.str();
}

「ヘッド」ポインターは、プッシュを呼び出すたびにその値を失うようです。なんで?多くの場合、ヘッド要素には ITSELF へのポインターが含まれますが、これはこのコードでは不可能です...

4

2 に答える 2

4

スタック上にオブジェクトを作成するため、オブジェクトがスコープ外になると破棄されます。その結果head、解放されたメモリを参照するため、ダングリング ポインターになります。

void DynIntStack::Push(int v)
{
    Element e = Element(v, head);
    head = &e;
}

あなたがする必要があるのは、次のようなヒープにオブジェクトを割り当てることです:

Element * e = new Element(v, head);
head = e;
于 2013-05-14T11:17:13.320 に答える
1

あなたのプログラムは で未定義の動作を示しTop()ます。の場合head == NULL、関数は何も返しません。その後、すべてのグローブがオフになります。

と同じですがPop、これも正しく実装されていないようです。デバッガーを介してコードを実行すると役立ちます。

于 2013-05-14T11:16:35.603 に答える