2012-04-18 7 views
1

したがって、VS 2008でC++で組み込み環境(ARMプロセッサ)を使用しています。私は私の会社のために中規模のプロジェクトを作りました。それはこれまでWindowsアプリケーションでした。私はコンソールアプリケーションに変更するように頼まれました。私はそれをWindowsアプリケーションにする本当の理由はありませんでした...最初は、私はVSで適切な設定を変更してから再構築しました。それはうまく構築されましたが、私はプログラムを実行しようとするたびに、タイトルで引用された例外を得ました。私は、コンソールアプリケーションに切り替える前に、プログラムが完全に機能していることを強調したいと思います。私はソリューション全体を完全にきれいにして再構築しました。静的STLセットに最初に挿入すると、処理されない例外0xC0000005が発生する:アクセス違反がスローされる

私はこの設定が手動で設定を変更するだけの問題だと思ったので、コンソールアプリケーションに設定された新しいプロジェクトを作成し、すべてのソース/その他の関連プロジェクトをそのプロジェクトに接続しました。これは、ソリューションのさまざまなプロジェクトがすべて正しくリンクされていれば、うまく構築されますが、同じエラーが発生します。

場合、プログラムがクラッシュすると、それは次のような方法でINSERTコマンドで停止:

template<class Elem> 
Node<Elem>* Node<Elem>::addChild(const Elem& value) 
{ 
    Node<Elem>* newNode = new Node(value); 
    newNode->m_pParentNode = this; 
    m_childList.push_back(newNode); 
    m_sNodeSet.insert(newNode); 
    return newNode; 
} 

m_sNodeSetは、ツリーの各ノードは一意でなければならないルールを適用することがあります。エラーは、このaddChildメソッドが初めて呼び出されたときに発生します。現時点では、m_sNodeSetはサイズがゼロであり、いくつかのメモリを割り当てる必要があります。しかし、スローされた例外は、Bad AllocではなくAccess Violationです。私はm_sNodeSet.get_allocator()を追加しようとしました。insertステートメントの前にallocate(5)を実行して、何かを行うかどうかを確認しましたが、同じ例外がスローされました。 m_sNodeSetは静的メンバー変数で、違いがある場合はそれです。

このNodeクラスは、私が作成したカスタムツリーオブジェクトです。私は何週間もこのツリープロジェクトで何も変更していないし、うまくいきました。このツリープロジェクトでは、これまでには見たことが無く完璧に実行していることは何も投げていないと思うので、ツリープロジェクト自体に問題はないと思います。

これは、ライブラリの境界を越えてSTLコンテナにアクセスする際の問題ではないことは確かです。このエラーは、単一の静的ライブラリの操作内で発生しています。

この作業を適切に行うために私のソリューションで変更が必要な設定が必要なような気がします。ソリューションには複数のプロジェクトがあり、1つはDLL、1つはLIB、もう1つはEXEです。ツリーは4番目のプロジェクトですが、それは単に適切なプロジェクトの「追加のインクルード」に入れられます。 EXEをコンソールアプリケーションとして実行するように変更しました。

ここに問題が発生している可能性があるすべてのインクがある場合は、非常に感謝します。

+0

機能にステップインしましたか? –

+0

コードは別のファイルで他の静的構造から呼び出される可能性がありますか? m_sNodeSetが初期化される前に? –

+3

これは役立ちますか?[静的初期化の失敗とは何ですか?](http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.14) –

答えて

1

あなたが宣言した場合:

// Global scope 
// > (quote)The m_sNodeSet is a static member variable, 
std::set<Node<Elem>*> Node<Elem>::m_sNodeSet; 

個人的なメモ:接頭m_は通常、メンバ変数(ない静的メンバ)の供与です。したがって、あなたはこの接頭辞を使用して多くの人々を混乱させます。

m_sNodeSetは静的メンバ上記のコードは、あなたが潜在的に初期化順序に問題があるメイン前を実行されている場合。これは解決するのは簡単です(下記参照)。それ以外の場合は、メモリが破損しています。

class Node 
{ 

    // Remove this line 
    // static std::set<Node*> m_sNodeSet; 
    // Replace with this code 
    static std::set<Node*>& getNodeSet() 
    { 
     static std::set<Node*> sNodeSet; 
     return sNodeSet; 
    } 
    // Replace all references to m_sNodeSet with getNodeSet() 
} 

方法getNodeSet()内部変数sNodeSetが静的​​従って最初の使用時に作成され、プログラムの長さのために生きているままであるため、これが動作します。各呼び出しは、同じオブジェクトへの参照を返します。最初の呼び出し時に作成されるため、使用ポイントに戻されたときには完全に構築されていることが保証されます。

+0

それは動作します!しかし、私は何がうまくいかないのか正確にはわかりません。静的メンバーが初期化されていないためです。しかし、なぜ?例外はメインのコンテキストでスローされました。私は、このマイナーなプロジェクト移行に伴ってビルドオーダーに関する何かが変わったと思います。ソリューションをありがとう! –

+0

コードがmainの後に実行されていた場合。それから、私はこれが問題ではないと思う。しかし、m_sNodeSetの後に構築されている他のグローバルオブジェクトは、それを上書きしていました。上記のコードを変更することによって、あなたはmerlyが物事を動かし、古い悪いコードがそこにまだ上書きされています。すべてのグローバル変数の監査は、開始するのに最適な場所だと思います。 –

関連する問題