Qt Forum

    • Login
    • Search
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    • Unsolved

    Update: Forum Guidelines & Code of Conduct


    Qt World Summit: Early-Bird Tickets

    Solved The program has unexpectedly stop + segmentation fault

    Game Development
    2
    5
    1005
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • N
      nhatz_hk last edited by

      Hi everyone, I'm just starting with some Qt Game development, but I recently stumble upon a problem that I can't solve. Can you help me please?
      Here is my code:

      collisionList += collidingItems();    //I update the list here
          for(qint64 i = 0; i < collisionList.size(); ++i) {
              if(typeid(*(collisionList[i])) == typeid(H_Bullet)) {//if ennemy touches bullet, remove both bullet and ennemy
                  emit ((H_Bullet*)collisionList[i])->touched();
      

      When I run my code it just randomly stops working. with no further explanation.
      When I go in debug mode, I find a segmentation fault in the line with the if or in the line with the emit.
      I have no idea how to fix this. My best guess is that when I update the list I somehow break something. It could also be a race condition, since I'm deleting items in another file too.
      Any suggestion are welcome, it wold even be better if you could explain me how to track down root cause of segmentation fault in the future.

      K 1 Reply Last reply Reply Quote 0
      • K
        koahnig @nhatz_hk last edited by

        @nhatz_hk

        Hi and welcome to devnet forum

        collisionList seems to pointers to item. Probably you have an unassigned pointer in there.

        collisionList += collidingItems();    //I update the list here
            for(qint64 i = 0; i < collisionList.size(); ++i) {
                if ( collisionList[i] ) {
                    if(typeid(*(collisionList[i])) == typeid(H_Bullet)) {//if ennemy touches bullet, remove both bullet and ennemy
                        emit ((H_Bullet*)collisionList[i])->touched();
                }
        

        The introduced pointer check above may help. However, it assumes that all pointers are ok and you have only some occassional zero pointer in there. There are certainly other possibilities that this list is wrong.

        In general you are avoiding segmentation fault when you are checking that the pointers are valid before you are using them. This is a simple zero pointer check.

        Vote the answer(s) that helped you to solve your issue(s)

        1 Reply Last reply Reply Quote 2
        • N
          nhatz_hk last edited by nhatz_hk

          Thaks for you quick answer. I tried your solution and indeed I have no more SIGSEGV, but SIGABRT. Do you know any better way to update the list to avoid unassigned pointers & co?

          K 1 Reply Last reply Reply Quote 0
          • K
            koahnig @nhatz_hk last edited by

            @nhatz_hk

            The best way to ensure that you are not entering in your problems is to ensure a list with correct pointers only.

            In your code fragment the first line looks a bit fishy, because you exntend something already available.

            collisionList += collidingItems();    //I update the list here
            

            When the is completly empty, it is probably fine, but then you may use also this:

            collisionList = collidingItems();    //I update the list here
            

            When the list contains already objects and the list will be only updated with some additional elements, it might be perfectly fine, but that depends compeltely on your other logic.

            For me it looks like a list which might be extended infinitely and possibly you are reacing the end of your memory.

            Vote the answer(s) that helped you to solve your issue(s)

            N 1 Reply Last reply Reply Quote 2
            • N
              nhatz_hk @koahnig last edited by

              @koahnig thanks a lot. My problem is solved. I also clear the list at each iteration (since its size will never be greater than 1), that way I'm sure that all the elements are valid.
              You are also right about the memory thing, I suspected that when I first ran my code with some qDebug but I couldn't spot what I was doing wrong.
              Again thanks a lot.

              1 Reply Last reply Reply Quote 0
              • First post
                Last post