2016-08-22 53 views
-4
/********************************************************************************************* 
* Function: Appends the Node newelement to the end of the List 
*********************************************************************************************/ 
void append(const T &newelement) 
{ 
    Node *N = new Node(newelement); 

    if(first == (Node*)0) 
    { 
     first = N; 
     last = N; 
     _length = 1; 

    } 
    else 
    { 
     last->insertNodeAfter(N); 
     last = N; 
     _length++; 
    } 
}; 

/********************************************************************************************* 
* Function: Appends the Node newelement to the end of the List 
*********************************************************************************************/ 
void prepend(const T &newelement) 
{ 
    Node *N = new Node(newelement); 

    if(first == (Node*)1) 
    { 
     first = N; 
     last = N; 
     _length = 1; 
    } 
    else 
    { 
     first->insertNodeBefore(N); 
     first = N; 
     _length++; 
    } 
}; 

AS PEOPLEが私に言ったことはありますか?このコードに絞ってみました。ノードを追加しようとすると壊れます。リスト。私にアクセスエラーなどを与えます。C++プログラムはMacで正しく動作しませんが、Windows上で動作します

+3

[TL;DR¡](https://en.wikipedia.org/wiki/TL;DR)問題のある部分のみにコードを絞り込むようにしてください(デバッグなど)。 [最小限の、完全で検証可能な例](http://stackoverflow.com/help/mcve)の作成方法と、[良い質問をする方法について読む](http://stackoverflow.com/help) /尋ねる方法)。 –

+5

このような問題を解決する適切なツールは、デバッガです。スタックオーバーフローを尋ねる前に、コードを一行ずつ進める必要があります。詳しいヘルプは、[小さなプログラムをデバッグする方法(Eric Lippert)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を参照してください。最低限、問題を再現する[最小、完全、および検証可能](http://stackoverflow.com/help/mcve)の例と、その問題を再現するためのデバッガ。 –

+0

私はバグがどこにあるのかわからないが、コードはWindowsではうまく動作するが、Macではうまく動作しない。私はそれを何かに絞ろうとしましたが、私がMacでそれを実行するたびに別の段階で壊れてしまいました。 – MichaelMariani

答えて

1

一見すると、例えばfirst == (Node*)1prepend)は無効で、未定義であり、ランダムな動作をします。チップとOSのメモリレイアウトによっては、これは生き残ったり、時には動作したり、常に動作したり、ランダムに失敗したり、常に失敗したりします。 Macとx86チップの動作が異なることは驚くことではない。

コードには、intのようなものが十分にあるように、複数の前提があります。

人が光沢を帯びる傾向にあるこれらのルールはすべて理由があり、これらのエラーの多くは1つのアーキテクチャではなく他のものではなくなります。

+0

最初の代わりに何をお勧めしますか==(Node *)1これは時々それを壊すものではありません。ときにはそれが追加されることもあります。 – MichaelMariani

+0

'(Node *)1'は'(Node *)0'のタイプミスです。使用する正しいものは 'nullptr'です。キャストする必要はありません。 – Barmar

+1

@MichaelMariani未定義の動作がある場合、問題の原因となっているコードで必ずしも死ぬとは限りません。未定義の振る舞いは、しばしば気づかれない方法でメモリを破壊します。 – Barmar

1

誤ってコードの関連部分を質問から削除する前に、そのバグはかなり明白でした。

DoubleLinkedNodeのコンストラクタは、nextNodeおよびpreviousNodeクラスメンバをNULLに初期化できません。この結果、未定義の動作が発生します。

特定の行でC++プログラムがクラッシュするだけで、そのバグがどこにあるのか分かりません。

新しいノードをリストに追加するときにクラッシュしています。

しかし、insertNodeAfter()が初期化されていないポインタを逆参照しているというバグがあります。そして、コンストラクタがそれらをNULLに初期化できないため、バグがあります。

+0

それは感謝しています。バグを見つけ出すために私たちに与えられたコードは書きませんでした。私はそれらの大部分を見つけて、ユニコードでコードを手に入れましたが、私が家に帰った時、それはちょうど私のMacを壊すでしょう。 – MichaelMariani

関連する問題