Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. QString bad alloc
Forum Updated to NodeBB v4.3 + New Features

QString bad alloc

Scheduled Pinned Locked Moved Unsolved General and Desktop
14 Posts 6 Posters 1.4k Views 1 Watching
  • 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.
  • M Offline
    M Offline
    Massimiliano75
    wrote on last edited by
    #1

    I use Qt 5.15.2, linux,

    every five seconds I create a string and append other strings to it from inside a thread for example:

    QStringList list;
    list.append(QString("1"))

    every 3/4 hours, very variable time crashes.

    stack

    __GI__libc_malloc
    QArrayData :: allocate (unsigned long, unsigned long, ...)
    QString :: QString (QChar const *, int)

    has it happened to someone?

    do you know if it is a bug fixed in the following qt?

    jsulmJ Christian EhrlicherC 2 Replies Last reply
    0
    • M Massimiliano75

      I use Qt 5.15.2, linux,

      every five seconds I create a string and append other strings to it from inside a thread for example:

      QStringList list;
      list.append(QString("1"))

      every 3/4 hours, very variable time crashes.

      stack

      __GI__libc_malloc
      QArrayData :: allocate (unsigned long, unsigned long, ...)
      QString :: QString (QChar const *, int)

      has it happened to someone?

      do you know if it is a bug fixed in the following qt?

      jsulmJ Offline
      jsulmJ Offline
      jsulm
      Lifetime Qt Champion
      wrote on last edited by
      #2

      @Massimiliano75 said in QString bad alloc:

      every five seconds I create a string

      Do you mean string list (QStringList)?
      Maybe you're getting out of memory?

      https://forum.qt.io/topic/113070/qt-code-of-conduct

      JonBJ 1 Reply Last reply
      0
      • jsulmJ jsulm

        @Massimiliano75 said in QString bad alloc:

        every five seconds I create a string

        Do you mean string list (QStringList)?
        Maybe you're getting out of memory?

        JonBJ Offline
        JonBJ Offline
        JonB
        wrote on last edited by JonB
        #3

        @jsulm said in QString bad alloc:

        Maybe you're getting out of memory?

        I calculate this incredibly roughly at, say, 100K after 4 hours. If the OP is running out of memory on this they have big problems!

        1 Reply Last reply
        0
        • M Massimiliano75

          I use Qt 5.15.2, linux,

          every five seconds I create a string and append other strings to it from inside a thread for example:

          QStringList list;
          list.append(QString("1"))

          every 3/4 hours, very variable time crashes.

          stack

          __GI__libc_malloc
          QArrayData :: allocate (unsigned long, unsigned long, ...)
          QString :: QString (QChar const *, int)

          has it happened to someone?

          do you know if it is a bug fixed in the following qt?

          Christian EhrlicherC Offline
          Christian EhrlicherC Offline
          Christian Ehrlicher
          Lifetime Qt Champion
          wrote on last edited by
          #4

          @Massimiliano75 said in QString bad alloc:

          other strings to it from inside a thread for example:

          You must not access an object from two different threads without proper locking mechanisms

          Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
          Visit the Qt Academy at https://academy.qt.io/catalog

          1 Reply Last reply
          1
          • M Offline
            M Offline
            Massimiliano75
            wrote on last edited by
            #5

            the object only lives in the thread, and I use TOP to see the memory status but it is always at 2/3% always low

            1 Reply Last reply
            0
            • kkoehneK Offline
              kkoehneK Offline
              kkoehne
              Moderators
              wrote on last edited by kkoehne
              #6

              do you know if it is a bug fixed in the following qt?

              It's very unlikely that this is a bug in QString itself (or malloc). A typical cause of such errors is heap corruption - that is, in some other code you're accessing memory outside of the allocated bounds, which corrupts the metadata that malloc uses to manage memory.

              These types of issues can be really hard to track down. Anyhow, a tool like valgrind/memcheck can be of help.

              Good luck!

              Director R&D, The Qt Company

              1 Reply Last reply
              4
              • SPlattenS Offline
                SPlattenS Offline
                SPlatten
                wrote on last edited by
                #7
                This post is deleted!
                1 Reply Last reply
                0
                • SPlattenS Offline
                  SPlattenS Offline
                  SPlatten
                  wrote on last edited by
                  #8

                  @Massimiliano75 , Can you please show or state the scopes of where your variables are defined?

                  For example where is QStringList list; defined and what is its lifetime ?

                  M 1 Reply Last reply
                  0
                  • SPlattenS SPlatten

                    @Massimiliano75 , Can you please show or state the scopes of where your variables are defined?

                    For example where is QStringList list; defined and what is its lifetime ?

                    M Offline
                    M Offline
                    Massimiliano75
                    wrote on last edited by
                    #9

                    @SPlatten
                    for example but line changes
                    2022-07-12_11h50_59.png 2022-07-12_11h49_10.png

                    1 Reply Last reply
                    0
                    • SPlattenS Offline
                      SPlattenS Offline
                      SPlatten
                      wrote on last edited by
                      #10

                      @Massimiliano75 , looking at the outer for loop, this will iterate as fast as it can on the hardware it is running on, there are no delays between iterates, each iterates starts by clearing the list then rebuilding it, the list isn't visible to anything else outside of the thread so by do you use a mutex to lock and unlock around appending data to what is an internal list and then only on the second append, I can't see that the mutex is required at all.

                      JonBJ 1 Reply Last reply
                      0
                      • SPlattenS SPlatten

                        @Massimiliano75 , looking at the outer for loop, this will iterate as fast as it can on the hardware it is running on, there are no delays between iterates, each iterates starts by clearing the list then rebuilding it, the list isn't visible to anything else outside of the thread so by do you use a mutex to lock and unlock around appending data to what is an internal list and then only on the second append, I can't see that the mutex is required at all.

                        JonBJ Offline
                        JonBJ Offline
                        JonB
                        wrote on last edited by JonB
                        #11

                        @SPlatten
                        I think the mutex lock is to protect something in the parameters OP is passing to listBarInfo.append() on that particular line, though not sure what....

                        SPlattenS 1 Reply Last reply
                        0
                        • JonBJ JonB

                          @SPlatten
                          I think the mutex lock is to protect something in the parameters OP is passing to listBarInfo.append() on that particular line, though not sure what....

                          SPlattenS Offline
                          SPlattenS Offline
                          SPlatten
                          wrote on last edited by
                          #12

                          @JonB , then wouldn't it be better to put the mutex locking and unlocking in the access method used?

                          JonBJ 1 Reply Last reply
                          0
                          • SPlattenS SPlatten

                            @JonB , then wouldn't it be better to put the mutex locking and unlocking in the access method used?

                            JonBJ Offline
                            JonBJ Offline
                            JonB
                            wrote on last edited by
                            #13

                            @SPlatten
                            Well quite possibly! But we don't know why whatever needs locking, and what it needs locking against. Maybe it only needs locking when called from here? Maybe the thing(s) which need locking do not have access to the mutexModuleData variable which we do here?

                            Certainly it might be clearer/safer to assign such things to local variables in a locked region and then pass those as parameters to whatever is being called, like e.g.:

                            mutexModuleData.lock();
                            auto something = sharedVariable;
                            auto something2 = sharedFunction();
                            listBarInfo.append(something, something2);
                            mutexModuleData.unlock();
                            

                            But this all assumes that is why the OP locked this particular statement and not others. For which we do not have confirmation.

                            SPlattenS 1 Reply Last reply
                            0
                            • JonBJ JonB

                              @SPlatten
                              Well quite possibly! But we don't know why whatever needs locking, and what it needs locking against. Maybe it only needs locking when called from here? Maybe the thing(s) which need locking do not have access to the mutexModuleData variable which we do here?

                              Certainly it might be clearer/safer to assign such things to local variables in a locked region and then pass those as parameters to whatever is being called, like e.g.:

                              mutexModuleData.lock();
                              auto something = sharedVariable;
                              auto something2 = sharedFunction();
                              listBarInfo.append(something, something2);
                              mutexModuleData.unlock();
                              

                              But this all assumes that is why the OP locked this particular statement and not others. For which we do not have confirmation.

                              SPlattenS Offline
                              SPlattenS Offline
                              SPlatten
                              wrote on last edited by
                              #14

                              @JonB , @Massimiliano75 , I would suggest that moving the mutex management into the access method its the logical and best place for it.

                              1 Reply Last reply
                              0

                              • Login

                              • Login or register to search.
                              • First post
                                Last post
                              0
                              • Categories
                              • Recent
                              • Tags
                              • Popular
                              • Users
                              • Groups
                              • Search
                              • Get Qt Extensions
                              • Unsolved