0

私のアプリの以下の循環キューコードを変更しました。

このキューは最大32個の要素を保持でき、クラス内で要素を構造体配列として宣言しました。キューに要素を追加するには、CreateElement()関数を呼び出す必要があります。この関数は、空き要素をチェックしてインデックスを返します。CreateElement関数で次の行を処理した後に要素を再利用すると、クラッシュします

    boost::shared_array<char> tData(new char[bufferSize]);

    m_QueueStructure[queueElems].data = tData;

ドキュメントによると、代入演算子は以前のオブジェクトを破棄し、新しいオブジェクトを割り当てることになっています。なぜクラッシュするのですか?誰かが私がどこにねじ込んでいるのか教えてもらえますか?

#include "boost/thread/condition.hpp"
#include "boost/smart_ptr/shared_array.hpp"
#include <queue>

#define MAX_QUEUE_ELEMENTS 32

typedef struct queue_elem
{
    bool            inUse;
    int             index;
    int             packetType;
    unsigned long   compressedLength;
    unsigned long   uncompressedLength;
    boost::shared_array<char> data;
}Data;

class CQueue
{
private:
    int                         m_CurrentElementsOfQueue;
    std::queue<Data>            the_queue;
    mutable boost::mutex        the_mutex;
    boost::condition_variable   the_condition_variable;
    Data                        m_QueueStructure[MAX_QUEUE_ELEMENTS];

public:

    CQueue()
    {
        m_CurrentElementsOfQueue = 0;

        for(int i = 0; i < MAX_QUEUE_ELEMENTS; i++)
        {
            m_QueueStructure[i].inUse = false;
            m_QueueStructure[i].index = i;
        }
    }

    ~CQueue()
    {
        for(int i = 0; i < m_CurrentElementsOfQueue; i++)
        {
            int index = wait_and_pop();

            Data& popped_value = m_QueueStructure[index];

            popped_value.inUse = false;
        }
        m_CurrentElementsOfQueue = 0;
    }

    void push(Data const& data)
    {
        boost::mutex::scoped_lock lock(the_mutex);

        the_queue.push(data);

        lock.unlock();      

        the_condition_variable.notify_one();
    }

    bool empty() const
    {
        boost::mutex::scoped_lock lock(the_mutex);
        return the_queue.empty();
    }

    bool try_pop(Data& popped_value)
    {
        boost::mutex::scoped_lock lock(the_mutex);
        if(the_queue.empty())
        {
            return false;
        }

        popped_value=the_queue.front();
        the_queue.pop();
        return true;
    }

    int wait_and_pop()
    {
        boost::mutex::scoped_lock lock(the_mutex);

        while(the_queue.empty())
        {
            the_condition_variable.wait(lock);
        }

        Data& popped_value=the_queue.front();

        the_queue.pop();

        return popped_value.index;
    }

    int CreateElement(int bufferSize, unsigned long _compressedLength, 
        unsigned long _uncompressedLength, int _packetType) /* Send data length for this function */
    {

        int queueElems = 0;

        if(m_CurrentElementsOfQueue == 32)
        {
            CCommonException ex(QERROR, QUEUE_FULL, "Circular Buffer Queue is full");
            throw ex;
        }

        for(queueElems = 0; queueElems < MAX_QUEUE_ELEMENTS; queueElems++)
        {
            if(m_QueueStructure[queueElems].inUse == false)
                break;
        }

        boost::shared_array<char> tData(new char[bufferSize]);

        m_QueueStructure[queueElems].data = tData;

        m_QueueStructure[queueElems].inUse  = true;

        m_QueueStructure[queueElems].compressedLength = _compressedLength;

        m_QueueStructure[queueElems].uncompressedLength = _uncompressedLength;

        m_QueueStructure[queueElems].packetType         = _packetType;

        m_CurrentElementsOfQueue++;

        return queueElems;
    }

    Data& GetElement(int index)
    {
        Data& DataElement = m_QueueStructure[index];

        return DataElement;
    }

    void ClearElementIndex(Data& delValue)
    {
        m_CurrentElementsOfQueue--;

        delValue.inUse = false;
    }

};
4

2 に答える 2

0

問題を解決しました。私が行った2つの変更。wait_and_pop関数で、Data&ではなくインデックスを返していました。Data&を返すと、割り当ての問題は解決しました。shared_array.get()のmemsetが原因で、別のクラッシュが発生していました。教訓を学びました。shared_arrayまたはshared_ptrをmemsetしないでください。

于 2012-05-10T01:20:41.593 に答える
0

for(queueElems = 0; queueElems < MAX_QUEUE_ELEMENTS; queueElems++)ループ後queueElemsの値は 32 ですが、m_QueueStructure32 要素しかないためm_QueueStructure[queueElems].data、33 番目の要素にアクセスしようとしています。それが問題です。

編集:使用してみてくださいm_QueueStructure[queueElems].data.reset(new char[bufferSize]);

于 2012-05-09T09:23:30.807 に答える