title: Qt + external library gaves glibc malloc(): memory corruption
body: <p>I’m doing a gui app with Qt 4.8.5 and c++ on a fedora 18. For that I am using also some external libraries compiled with eclipse.</p>
  
  <p>Until last week it worked all okey, I could call and use that external library functions with no problem.</p>
  
  <p>The first error ocurred last week when a memorry corruption appeared with something like this (I can’t remember exactly all):</p>
  
  <pre><code>** glibc detected [...] malloc(): memory corruption: 0x10013ff8 ***
  </code></pre>
  
  <p>I clean and run qmake and nothing.. and then I run valgrand (I still don’t know what is that exactly for but it worked).</p>
  
  <p>Today I got some error like this and did same and it worked but lately again I had:</p>
  
  <pre><code>*** glibc detected *** /home/sg/Documents/Projects/myApp/build-myApp-Desktop-Debug/myApp: malloc(): memory corruption: 0x0986f260 ***
  </code></pre>
  
  <p>And valgrind did nothing so lookign for internet I saw that it could be fixed with a external valgrind so I follow this instructions: <a href="http://developer.nokia.com/community/wiki/Using_valgrind_with_Qt_Creator" rel="nofollow">Valgrind</a></p>
  
  <p>And it solved my problem… BUT now my app runs well if I run it like the example (running vlagrind) but if I try to run it like I was doing before (Just run debug/release of myApp) then the glibc memorry corruption appears again… and that seems to be a very bad problem because ofc the .exe will not run …</p>
  
  <p>so… any idea of the problem? The only difference on the external libraries this time is that they have a couple of get and sets more so there is no malloc or array or something like that new that could cause a memor acces problem</p>
  
  <p>note: in the arguments line I had to put:</p>
  
  <pre><code>-q --tool=memcheck --leak-check=full --leak-resolution=low ./myApp
  </code></pre>
  
  <p>with no supression because it gaved me an error… tried also with qt48 but the same.</p>
  
  <p>Valgrind prints some things like this on the console:</p>
  
  <pre><code>==2848== Invalid write of size 4
  ==2848==    at 0x435CA6E3: pthread_mutex_init (in /usr/lib/libpthread-2.16.so)
  ==2848==    by 0x808A450: TLib::CSection::CSection() (Section.cpp:11)
  ==2848==    by 0x80773D6: CClass1::CClass1() (Class1.cpp:15)
  ==2848==    by 0x807C642: CClass2::CClass2() (Class2.cpp:21)
  ==2848==    by 0x807C800: CClass2::Initialize() (Class1.cpp:51)
  ==2848==    by 0x805A346: BaseWizard::BaseWizard(QWidget*) (basewizard.cpp:49)
  ==2848==    by 0x80523A2: main (main.cpp:26)
  ==2848==  Address 0x5b09f14 is 0 bytes after a block of size 292 alloc'd
  ==2848==    at 0x4008AAD: operator new(unsigned int) (vg_replace_malloc.c:292)
  ==2848==    by 0x807C638: CClass2::CClass2() (Class2.cpp:21)
  ==2848==    by 0x807C800: CClass2::Initialize() (Class2.cpp:51)
  ==2848==    by 0x805A346: BaseWizard::BaseWizard(QWidget*) (basewizard.cpp:49)
  ==2848==    by 0x80523A2: main (main.cpp:26)
  
  ==2848== Invalid read of size 4
  ==2848==    at 0x438EBA44: std::string::_M_mutate(unsigned int, unsigned int, unsigned int) (in /usr/lib/libstdc++.so.6.0.17)
  ==2848==    by 0x438EBC32: std::string::_M_replace_safe(unsigned int, unsigned int, char const*, unsigned int) (in /usr/lib/libstdc++.so.6.0.17)
  ==2848==    by 0x438EBCDB: std::string::assign(char const*, unsigned int) (in /usr/lib/libstdc++.so.6.0.17)
  ==2848==    by 0x438EBF16: std::string::operator=(char const*) (in /usr/lib/libstdc++.so.6.0.17)
  ==2848==    by 0x80767B4: CClass3::CClass3() (Class3.cpp:39)
  ==2848==    by 0x807C6E2: CClass2::CClass2() (Class2.cpp:34)
  ==2848==    by 0x807C800: CClass2::Initialize() (Class2.cpp:51)
  ==2848==    by 0x805A346: BaseWizard::BaseWizard(QWidget*) (basewizard.cpp:49)
  ==2848==    by 0x80523A2: main (main.cpp:26)
  ==2848==  Address 0x5b15efc is 4 bytes after a block of size 48 alloc'd
  ==2848==    at 0x4008AAD: operator new(unsigned int) (vg_replace_malloc.c:292)
  ==2848==    by 0x807C6D8: CClass2::CClass2() (Class2.cpp:34)
  ==2848==    by 0x807C800: CClass2::Initialize() (Class2.cpp:51)
  ==2848==    by 0x805A346: BaseWizard::BaseWizard(QWidget*) (basewizard.cpp:49)
  ==2848==    by 0x80523A2: main (main.cpp:26)
  </code></pre>
  
  <p>There are like 5 times more that information and then it throws the program. But if I run it without valdring then it says the glibc malloc() memory corruption. (And there have NOT been any changes about creating mallocs or frees or deletes or something like this).</p>
  
  <p>note: About that references… main and basewizard are my classes on Qt (main.cppp and basewizard is the QWizard), and Class1,2,3 and CSection are from the external libraries</p>
  
  <p>Thank you so much.</p>