LINUX.ORG.RU

Помогите понять причину segfault'а

 


0

1

Есть примерно такой код:

class A{
 public:
 A(void (*funPnt)(void*)){
  _funPnt = funPnt;
 }

 void start(){
  started = true;
  loop();
 }

 void stop(){
  started = false;
 }

 private:
 bool started = false;
 void (*_funPnt)(void*);
 void *args;
 void loop(){
 while(started){
    ...
    if (...)
     if(_funPnt)
      _funPnt(args);
  }
 }
}

class B{
 public:
 B(){
  a = new A([](void *tmp){static_cast<B*>(tmp)->stop()}, this)
 }
 void start(){
  pthread_t thread;
  pthread_create(&thread,
		nullptr,
		[](void * tmp) -> void * {static_cast<A*>(tmp)->start(); return nullptr;},
		a);
  pthread_join(thread, nullptr);
 }

 void stop(){
  a->stop();  //<----------------------Падает здесь
 }

 private:
 A *a; 
}

int main(){
 B b;
 b.start();
}



В указанной строчке происходит падение.
★★★★★

Последнее исправление: deterok (всего исправлений: 3)

Ответ на: комментарий от deterok

Поправил.

ставь брекпоинт на деструктор A - проверь, что объект не был удален на момент вызова, аналогично для B

wota ★★
()
Ответ на: комментарий от wota

Деструктор не вызывается, но есть подозрение, что проблема в args*

deterok ★★★★★
() автор топика

удобная иде + gdb тебе в помощъ

punya ★★
()

Я не понял эту строку

a = new A([](void *tmp){static_cast<B*>(tmp)->stop()}, this)
, но если
a->stop();  //<----------------------Падает здесь
не заходя в другую функцию, то проблема в той непонятной строке. Либо неверный args...

backbone ★★★★★
()
Последнее исправление: backbone (всего исправлений: 1)
Ответ на: комментарий от backbone

lambda expression
[](void *tmp){static_cast<B*>(tmp)->stop();} почти равносильно объявлению такой функции и возврату указателя на нее:

void fun(void *tmp){
  static_cast<B*>(tmp)->stop();
}

deterok ★★★★★
() автор топика
Ответ на: комментарий от deterok

Ясно, слышал, видел, но не знал как называется.

Я так понял, там 2-ой конструктор для A есть вроде.

A(void (*funPnt)(void*), void *bPtr)

Может в нём пропущено что-нибудь типа args=bPtr ?

backbone ★★★★★
()

Все, проблема решена.
Виноват был я(создал временную переменную забыл проинициализировать в конструкторе B *args)
Всем спасибо.

deterok ★★★★★
() автор топика
Ответ на: комментарий от buddhist

Никто вас не заставляет ими пользоваться, к тому же их необязательно писать в одной строчке как в python'е.

deterok ★★★★★
() автор топика
Ответ на: комментарий от deterok

Не заставляют, но выдают за некую нереальную фичу.

buddhist ★★★★★
()
Ответ на: комментарий от deterok

std::function<void (void*)> funPnt вместо void (*funPnt)(void*) тоже будет чуть лучше выглядеть.

frozenix ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.