1. <i id='Ll8QX'><tr id='Ll8QX'><dt id='Ll8QX'><q id='Ll8QX'><span id='Ll8QX'><b id='Ll8QX'><form id='Ll8QX'><ins id='Ll8QX'></ins><ul id='Ll8QX'></ul><sub id='Ll8QX'></sub></form><legend id='Ll8QX'></legend><bdo id='Ll8QX'><pre id='Ll8QX'><center id='Ll8QX'></center></pre></bdo></b><th id='Ll8QX'></th></span></q></dt></tr></i><div id='Ll8QX'><tfoot id='Ll8QX'></tfoot><dl id='Ll8QX'><fieldset id='Ll8QX'></fieldset></dl></div>

        <tfoot id='Ll8QX'></tfoot>
        <legend id='Ll8QX'><style id='Ll8QX'><dir id='Ll8QX'><q id='Ll8QX'></q></dir></style></legend>
          <bdo id='Ll8QX'></bdo><ul id='Ll8QX'></ul>

        <small id='Ll8QX'></small><noframes id='Ll8QX'>

        Valgrind 在给字符串赋值时报告内存泄漏

        时间:2023-09-26

        <small id='HUpvF'></small><noframes id='HUpvF'>

            <tbody id='HUpvF'></tbody>

        1. <legend id='HUpvF'><style id='HUpvF'><dir id='HUpvF'><q id='HUpvF'></q></dir></style></legend>
            <tfoot id='HUpvF'></tfoot>
            • <i id='HUpvF'><tr id='HUpvF'><dt id='HUpvF'><q id='HUpvF'><span id='HUpvF'><b id='HUpvF'><form id='HUpvF'><ins id='HUpvF'></ins><ul id='HUpvF'></ul><sub id='HUpvF'></sub></form><legend id='HUpvF'></legend><bdo id='HUpvF'><pre id='HUpvF'><center id='HUpvF'></center></pre></bdo></b><th id='HUpvF'></th></span></q></dt></tr></i><div id='HUpvF'><tfoot id='HUpvF'></tfoot><dl id='HUpvF'><fieldset id='HUpvF'></fieldset></dl></div>
                • <bdo id='HUpvF'></bdo><ul id='HUpvF'></ul>
                  本文介绍了Valgrind 在给字符串赋值时报告内存泄漏的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                  问题描述

                  Valgrind 在为字符串赋值时报告内存泄漏.

                  Valgrind reports a memory leak when assigning a value to a string.

                  我使用以下简单代码来测试 Valgrind 报告的内存泄漏.

                  I used the following simple code to test an memory leak reported by Valgrind.

                  /******************************************
                  * FILE: t3.c
                  * Compiled using : g++ -g t3.c -o t3
                  *
                  * $ g++ -v
                  * Reading specs from /usr/lib/gcc/i686-pc-linux-gnu/3.4.6/specs
                  * Configured with: ./configure --prefix=/usr --infodir=/share/info --mandir=/share/man
                  *      --enable-languages=c,c++ --with-system-zlib --program-suffix=-3.4 --enable-threads=posix
                  * Thread model: posix
                  * gcc version 3.4.6
                   ******************************************/
                  
                  
                  #include <iostream>
                  #include <string>
                  
                  using namespace std;
                  
                  /**************************************************************
                   **************************************************************/
                  int main(int argc, char *argv[])
                  {
                     string test = "XXXXXXXXX";
                     cout << "this is a test " << test << endl;
                     exit(0);
                  }
                  

                  我使用这个命令编译:

                  $ g++ -g t3.c -o t3
                  

                  当我运行 Valgrind 时,它会在我尝试为字符串赋值时报告内存泄漏.我正在使用这个简单的测试来调查真实程序中的一些内存泄漏,似乎使用字符串会导致某种问题.

                  And when I run Valgrind it reports a memory leak when I try to assign a value to a string. I'm using this simple test to investigate some memory leak in the real program, and it seems that using string can cause some sort of problem.

                  通过 0x8048A6F: main (t3.c:23) 是行:string test = "XXXXXXXXX";有人可以对这种奇怪的行为给出一些提示吗?

                  By 0x8048A6F: main (t3.c:23) is the line : string test = "XXXXXXXXX"; Can someone give some hint on such strange behaviour?

                  [enzo@P0101222 C]$   valgrind --leak-check=full  ./t3
                  ==3910== Memcheck, a memory error detector.
                  ==3910== Copyright (C) 2002-2007, and GNU GPL'd, by Julian Seward et al.
                  ==3910== Using LibVEX rev 1732, a library for dynamic binary translation.
                  ==3910== Copyright (C) 2004-2007, and GNU GPL'd, by OpenWorks LLP.
                  ==3910== Using valgrind-3.2.3, a dynamic binary instrumentation framework.
                  ==3910== Copyright (C) 2000-2007, and GNU GPL'd, by Julian Seward et al.
                  ==3910== For more details, rerun with: -v
                  ==3910==
                  this is a test XXXXXXXXX
                  ==3910==
                  ==3910== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 25 from 1)
                  ==3910== malloc/free: in use at exit: 102 bytes in 3 blocks.
                  ==3910== malloc/free: 4 allocs, 1 frees, 126 bytes allocated.
                  ==3910== For counts of detected errors, rerun with: -v
                  ==3910== searching for pointers to 3 not-freed blocks.
                  ==3910== checked 194,136 bytes.
                  ==3910==
                  ==3910== 16 bytes in 1 blocks are definitely lost in loss record 1 of 3
                  ==3910==    at 0x4017846: malloc (m_replacemalloc/vg_replace_malloc.c:149)
                  ==3910==    by 0x4018E05: realloc (m_replacemalloc/vg_replace_malloc.c:306)
                  ==3910==    by 0x41B441A: argz_append (in /lib/libc-2.2.5.so)
                  ==3910==    by 0x41593B9: __newlocale (in /lib/libc-2.2.5.so)
                  ==3910==    by 0x40E010B: std::locale::facet::_S_create_c_locale(__locale_struct*&, char const*, __locale_struct*) (c++locale.cc:99)
                  ==3910==    by 0x407EF6F: std::locale::facet::_S_initialize_once() (../../.././libstdc++-v3/src/locale.cc:172)
                  ==3910==    by 0x407EFB4: std::locale::facet::_S_get_c_locale() (../../.././libstdc++-v3/src/locale.cc:185)
                  ==3910==    by 0x407A422: std::ctype<char>::ctype(unsigned short const*, bool, unsigned) (/usr3/BUILD/gcc/gcc-3.4.6/i686-pc-linux-gnu/libstdc++-v3/include/i686-pc-linux-gnu/bits/ctype_noninline.h:104)
                  ==3910==    by 0x40801D5: std::locale::_Impl::_Impl(unsigned) (/usr3/BUILD/gcc/gcc-3.4.6/libstdc++-v3/libsupc++/new:92)
                  ==3910==    by 0x4080EED: std::locale::_S_initialize_once() (/usr3/BUILD/gcc/gcc-3.4.6/libstdc++-v3/libsupc++/new:92)
                  ==3910==    by 0x4080F84: std::locale::_S_initialize() (../../.././libstdc++-v3/src/locale_init.cc:155)
                  ==3910==    by 0x4080FE7: std::locale::locale() (../../.././libstdc++-v3/src/locale_init.cc:102)
                  ==3910==
                  ==3910==
                  ==3910== 22 bytes in 1 blocks are possibly lost in loss record 2 of 3
                  ==3910==    at 0x4017C38: operator new(unsigned) (m_replacemalloc/vg_replace_malloc.c:163)
                  ==3910==    by 0x40BF2C4: std::string::_Rep::_S_create(unsigned, unsigned, std::allocator<char> const&) (/usr3/BUILD/gcc/gcc-3.4.6/i686-pc-linux-gnu/libstdc++-v3/include/ext/new_allocator.h:81)
                  ==3910==    by 0x40C1CE4: char* std::string::_S_construct<char const*>(char const*, char const*, std::allocator<char> const&, std::forward_iterator_tag) (/usr3/BUILD/gcc/gcc-3.4.6/i686-pc-linux-gnu/libstdc++-v3/include/bits/basic_string.tcc:150)
                  ==3910==    by 0x40C1E15: std::string::string(char const*, std::allocator<char> const&) (/usr3/BUILD/gcc/gcc-3.4.6/i686-pc-linux-gnu/libstdc++-v3/include/bits/basic_string.h:1386)
                  ==3910==    **by 0x8048A6F: main (t3.c:23)**
                  ==3910==
                  ==3910== LEAK SUMMARY:
                  ==3910==    definitely lost: 16 bytes in 1 blocks.
                  ==3910==      **possibly lost: 22 bytes in 1 blocks.**
                  ==3910==    still reachable: 64 bytes in 1 blocks.
                  ==3910==         suppressed: 0 bytes in 0 blocks.
                  ==3910== Reachable blocks (those to which a pointer was found) are not shown.
                  ==3910== To see them, rerun with: --leak-check=full --show-reachable=yes
                  [enzo@P0101222 C]$
                  

                  推荐答案

                  因为你调用了 exit(0),所以永远不会调用字符串析构函数.只需使用 return 0.

                  Because you call exit(0), so the string destructor is never invoked. Just use return 0.

                  详细地说,std::string 的构造函数分配堆内存来存储字符串,依靠析构函数来释放内存.如果在栈上声明一个字符串对象,当字符串对象超出范围时,析构函数会自动调用,从而释放内存.但是exit其实是C机制;它立即退出程序而不执行堆栈展开,这意味着不会调用本地堆栈对象的 C++ 析构函数.

                  To elaborate, the constructor of std::string allocates heap memory to store the string, relying on the destructor to deallocate that memory. If you declare a string object on the stack, the destructor will automatically be invoked when the string object goes out of scope, thus freeing the memory. But exit is really a C mechanism; it immediately exits the program without performing stack-unwinding meaning that C++ destructors for local stack objects will not be called.

                  这篇关于Valgrind 在给字符串赋值时报告内存泄漏的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                  上一篇:为什么 free(p) 不将 p 设置为 NULL? 下一篇:在 C++ 中检查内存泄漏的最佳方法是什么?

                  相关文章

                    <bdo id='0MbRn'></bdo><ul id='0MbRn'></ul>
                  1. <legend id='0MbRn'><style id='0MbRn'><dir id='0MbRn'><q id='0MbRn'></q></dir></style></legend>
                    <tfoot id='0MbRn'></tfoot>

                      <i id='0MbRn'><tr id='0MbRn'><dt id='0MbRn'><q id='0MbRn'><span id='0MbRn'><b id='0MbRn'><form id='0MbRn'><ins id='0MbRn'></ins><ul id='0MbRn'></ul><sub id='0MbRn'></sub></form><legend id='0MbRn'></legend><bdo id='0MbRn'><pre id='0MbRn'><center id='0MbRn'></center></pre></bdo></b><th id='0MbRn'></th></span></q></dt></tr></i><div id='0MbRn'><tfoot id='0MbRn'></tfoot><dl id='0MbRn'><fieldset id='0MbRn'></fieldset></dl></div>

                    1. <small id='0MbRn'></small><noframes id='0MbRn'>