Определение класса
class TaskWorker
{
...
private:
std::list<client_det*> clientList;
...
public:
void waitForClientResponse();
};
Функция для запуска функции члена класса в виде потока
void* waitForResponse(void* w)
{
TaskWorker* worker = static_cast<TaskWorker*>(w);
worker->waitForClientResponse();
}
Реализация функции потока
void TaskWorker::waitForClientResponse()
{
client_det* obj = new client_det();
...
clientList.push_back(obj); //valgrind says access violation
...
}
Что-то не так в этой реализации?
Есть ли какое-либо ограничение в функции члена класса потока, доступ к списку частных членов?
Вызов темы
int TaskWorker::assign_and_wait(std::list<MulticastGroupInfo*> groupList)
{
...
...
pthread_t tid;
pthread_create(&tid, NULL, waitForResponse, this);
}
Обновить
Я скомпилировал свой код без символов отладки, и авария исчезла. Это мое последнее наблюдение.
Кто-нибудь может просветить меня, что здесь происходит?
Вот несколько вещей, которые могут вызвать ошибку сегментации в вашем коде:
Экземпляр TaskWorker
может быть NULL
как нет нулевой проверки в void* waitForResponse(void* w)
. Это может привести к нарушению доступа в void TaskWorker::waitForClientResponse()
при самом первом доступе к переменной-члену.
Пожалуйста, избегайте каких-либо небезопасных операций с строкой стиля C. Например, если вы не достаточно осторожны с помощью strcpy
, он переполнит ваш буфер и перезапишет некоторую несвязанную память.
Если несколько потоков совместно используют clientList
(или любой другой общий ресурс), убедитесь, что у вас есть соответствующий механизм взаимного исключения.
w
был NULL worker->waitForClientResponse()
сам бы не worker->waitForClientResponse()
worker->waitForClientResponse()
вызывает неопределенное поведение. Обычно не виртуальные вызовы функций-членов с нулевым указателем выглядят успешными, пока вы не попытаетесь получить доступ к переменной-члену несуществующего объекта. (Например: ideone.com/4jr2ur )
w
неNULL
?this
из другой функции-члена. Это правильно?