1

しばらく前から、私は問題に直面しており、解決策が見つかりませんでした:(

私はそのようなクラスを持っています:

template<typename Node, unsigned int Threads, unsigned int Size = 2, unsigned int Prefill = 50>
class HazardManager {
    public:
        HazardManager();

        HazardManager(const HazardManager& rhs) = delete;

        /* Some methods */

    private:
        Node* Pointers[Threads][Size];

        std::list<Node*> LocalQueues[Threads];
        std::list<Node*> FreeQueues[Threads];

        /* Some private methods */
};

このクラスは別のクラス内で使用されます。

template<typename T, int Threads>
class AVLTree {
    public:
        AVLTree();
        ~AVLTree();

    private:
        Node* rootHolder;

        HazardManager<Node, Threads, 3> hazard;

        unsigned int Curren[Threads];
};

そして、AVLTree クラスがスタックに割り当てられます。AVLTree が破棄されると、std::list デストラクタでセグメンテーション違反が発生しました。valgrind の出力は次のとおりです。

==9336== Invalid read of size 8
==9336==    at 0x419F69: std::_List_base<avltree::Node*, std::allocator<avltree::Node*> >::_M_clear() (list.tcc:74)
==9336==    by 0x419645: std::_List_base<avltree::Node*, std::allocator<avltree::Node*> >::~_List_base() (stl_list.h:401)
==9336==    by 0x418DF9: std::list<avltree::Node*, std::allocator<avltree::Node*> >::~list() (stl_list.h:458)
==9336==    by 0x418E66: HazardManager<avltree::Node, 1u, 3u, 1u>::~HazardManager() (in /home/wichtounet/dev/btrees/bin/btrees)
==9336==    by 0x418F19: avltree::AVLTree<int, 1>::~AVLTree() (AVLTree.hpp:154)
==9336==    by 0x418D9A: void testST<avltree::AVLTree<int, 1> >(std::string const&) (test.cpp:110)
==9336==    by 0x41831D: test() (test.cpp:180)
==9336==    by 0x41CFF8: main (main.cpp:19)
==9336==  Address 0x0 is not stack'd, malloc'd or (recently) free'd

私の意見では、それはスタックの破損の場合ですが、それがどこから来るのかわかりません...クラス自体の使用中にエラーはなく、破壊された場合にのみ発生します。

このエラーを見つけるのに役立つツールや、この種の破損がいつ発生するかを見つけるのに役立つヒントはありますか?

GCC 4.7 を使用して、アプリケーションをデバッグ シンボル付きで最適化なしでコンパイルしています。

助けやアイデアを事前にありがとう

4

2 に答える 2

2

リストを破損するオーバーインデックスを作成している可能性があります。これはHazardManager::Pointers、デストラクタが無効なメモリにアクセスしようとしている場合にのみ認識されます (ポインターが文字化けしたため)。

于 2012-04-12T12:15:42.587 に答える
2

boost::array/に切り替えてstd::array使用するとatout_of_range例外が発生します。

于 2012-04-12T13:06:34.653 に答える