Ошибка сегмента с указателями malloc'd - PullRequest
1 голос
/ 16 мая 2010

Я делаю класс потока для использования в качестве оболочки для pthreads. У меня есть класс Queue для использования в качестве очереди, но у меня проблемы с этим. Кажется, что она хорошо распределяет и заполняет структуру очереди, но когда я пытаюсь получить из нее данные, это Seg. неисправностей.

http://pastebin.com/Bquqzxt0 (printf предназначены для отладки, оба сбоя броска сегмента)

edit: очередь хранится в динамически распределенном массиве "struct queueset" в качестве указателя на данные и индекса для данных.

1 Ответ

3 голосов
/ 16 мая 2010

C ++ предоставляет вам встроенный класс очереди:

#include <queue>

struct queueset
{
    void* ptr;
    int index;

    queueset(void* p, int i) : ptr(p), index(i) {}
};

class pthreadmutexlock
{
public:
    pthreadmutexlock()
    {
        pthread_mutex_init(&lock, NULL);
        pthread_mutex_lock(&lock);
    }

    ~pthreadmutexlock()
    {
        pthread_mutex_unlock(&lock);
        pthread_mutex_destroy(&lock);
    }
private:
    pthread_mutex_t lock;
};

class ThreadSafeQueue
{
public:
    void add(void* msg, int index);
    queueset get();
    bool hasitems() const { return !queue.empty(); }
private:
    std::queue<queueset> queue;
    pthread_mutex_t lock;
};

void ThreadSafeQueue::add(void* msg, int index)
{
    pthreadmutexlock lock;
    queue.push(queueset(msg, index));
}

queueset ThreadSafeQueue::get()
{
    pthreadmutexlock lock;
    queueset temp = queue.front();
    queue.pop();
    return temp;
}

В C ++ лучший способ избежать проблем с памятью - минимизировать управление памятью, используя как можно больше необработанных указателей, и использовать стандартные классы, где это применимо.

...