0

私はQStackを持っています>それはアプリケーションから常に満たされています。QMutexLockerでそれを保護しています。QStackは静的です。数回挿入した後、次のようになりました:

0xC0000005: Access violation reading location 0x00000004  

これは、例外が表示される関数です

bool MyClass::AppendToLinks(QVector<std::map<std::string,std::string > >& linksvec)
{
    try
    {

        static QMutex mutex;
        QMutexLocker locker(&mutex);

        //used to: be m_OuterLinksToProcessOutStack+= linksvec;

        QStack<std::map<std::string,std::string > > stackTemp;
        stackTemp = m_OuterLinksToProcessOutStack;
        stackTemp  << linksvec;
            // here is where the exception appear :
        m_OuterLinksToProcessOutStack = stackTemp;
        locker.unlock();
        if(m_OuterLinksToProcessOutStack.size()>0)
        {

            return true;
        }

        return false;
    }
    catch (std::exception const & e)
    {
        std::cout << "Standard exception: " << e.what() << std::endl;

    }
    catch (...)
    {
        std::cout << "Unknown exception." << std::endl;

    }
}

そしてこれはスタックです:

myapp.exe!std::_Tree<std::_Tmap_traits<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >,0> >::_Copy(const std::_Tree<std::_Tmap_traits<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >,0> > & _Right={...})  Line 1063 + 0x11 bytes    C++
    myapp.exe!std::_Tree<std::_Tmap_traits<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >,0> >::_Tree<std::_Tmap_traits<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >,0> >(const std::_Tree<std::_Tmap_traits<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >,0> > & _Right={...})  Line 536  C++
    myapp.exe!QVector<std::map<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,std::basic_string<char,std::char_traits<char>,std::allocator<char> > > > > >::realloc(int asize=12, int aalloc=12)  Line 532 + 0x1e bytes    C++
    myapp.exe!QVector<std::map<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,std::basic_string<char,std::char_traits<char>,std::allocator<char> > > > > >::operator+=(const QVector<std::map<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,std::basic_string<char,std::char_traits<char>,std::allocator<char> > > > > > & l={...})  Line 684    C++
    myapp.exe!MyClass::AppendToLinks(QVector<std::map<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,std::basic_string<char,std::char_traits<char>,std::allocator<char> > > > > > & linksvec={...})  Line 93   C++

QVector と Stacks の両方が空でも null でもないように見えます。他に何がありますか?

4

2 に答える 2

2

mutexが へのアクセスを保護している場合はm_OuterLinksToProcessOutStack、 への呼び出し全体でロックを維持する必要がありますif(m_OuterLinksToProcessOutStack.size()>0)。したがって、tryブロック内には次のようなものが必要です。

static QMutex mutex;
QMutexLocker locker(&mutex);
m_OuterLinksToProcessOutStack += linksvec;
return !m_OuterLinksToProcessOutStack.isEmpty();

ただし、これはまだ少し疑わしいようです。これがプログラムでアクセスされる唯一の場所である場合m_OuterLinksToProcessOutStack、ミューテックスがローカルの静的オブジェクトであっても問題ありません。しかし、それ以外の場所でアクセスされた場合mutex、保護することはできませんm_OuterLinksToProcessOutStack

が他の場所でアクセスされる場合m_OuterLinksToProcessOutStack 、それらの場所でも同じミューテックスを使用できるようにする必要があります (たとえば、クラス メンバーにする)。

于 2012-11-18T15:22:57.213 に答える
1

m_OuterLinksToProcessOutStack別の機能で (QStack からリンクをプルするリーダーによって) アクセスされているように見えますが、その場所はミューテックスによって保護されていません。したがって、m_OuterLinksToProcessOutStack別のスレッドが使用しているときに再定義しようとすると、エラーが発生します。

コンテナを再定義する場合、新しいコンテンツを受け入れる前に、まず以前のコンテンツを破棄する必要があります。コンテナーが現在使用されている場合、これが問題になる理由がわかります。m_OuterLinksToProcessOutStack直接追加するのではなく、一時的なスタックを作成するのはなぜですか?

また、その関数で QVector と QStack を混在させています。問題はありませんが、後でアクセスする方法によって異なる場合があります。

于 2012-11-19T21:13:59.333 に答える