我应该多严肃考虑Valgrind和小内存泄漏(假设< 100字节)?

时间:2012-07-18 04:48:16

标签: c++ memory-management memory-leaks valgrind

如果我在函数的循环中初始化一个临时变量(比如一个char *,而不是“new”),那么我是否需要明确地释放它,或者当它超出范围时它会被处理掉吗?后者就是我所教过的......当我通过Valgrind运行我的代码时,我得到“15个字节肯定会丢失”,但它们似乎处于类似于上面的区域......超出范围的临时变量。这些不是用“new”分配的东西...... Valgrind是根据代码的样子得到它的一些数字还是它实际上是在捕获孤立的内存?当使用Valgrind时,大多数人都希望看到一些小数字丢失或者0字节丢失了游戏名称?谢谢你们。

==7669== 15 bytes in 1 blocks are definitely lost in loss record 1 of 1                    │        std::cout << "    ...printing newly initia
==7669==    at 0x402B454: operator new[](unsigned int) (in /usr/lib/valgrind/vgpreload_memc│lized customer..." << std::endl;                  
heck-x86-linux.so)                                                                         │        if (true)                                 
==7669==    by 0x8049C4B: Customer::copyString(char const*&, char*&) (customer.cpp:539)    │        {                                         
==7669==    by 0x804992A: Customer::getName(char*&) (customer.cpp:379)                     │                const char * name = "bunches, oate
==7669==    by 0x8048C2D: main (main.cpp:78)                                               │s";                                               
==7669==                                                                                   │                Customer cus5(name);              
==7669== LEAK SUMMARY:                                                                     │                cus4 = cus5;                      
==7669==    definitely lost: 15 bytes in 1 blocks                                          │        }                                         
==7669==    indirectly lost: 0 bytes in 0 blocks                                           │                                                  
==7669==      possibly lost: 0 bytes in 0 blocks                                           │        cus4.displayData();                       
==7669==    still reachable: 0 bytes in 0 blocks                                           │        std::cout << std::endl;                   
==7669==         suppressed: 0 bytes in 0 blocks  

“copyString()”方法和“getName()”方法都只有临时变量......其他所有内容都被释放...“main.cpp”有一些我没有释放的内存,但因为它是我的测试工具我不太担心此时要清理它。如果Valgrind列出的东西(例如3行:copyString,getName和main)这是否意味着它们肯定会丢失内存或只是它们可能会丢失?

这是“getName()”函数:

int Customer::getName(char *& toReturn)
{
        if (name)
        {
                const char * nameCopy = name; //casting
                delete toReturn;
                copyString(nameCopy, toReturn);
                delete nameCopy;
                return 1;
        }
        else
        {
                toReturn = NULL;
                return 0;
        }
}

这是copyString()函数:

int Customer::copyString(const char *& toCopy, char *& set)
{
        //prevent strlen or strcpy from being called on NULL
        if (!toCopy)
                return -1;

        //copy data into new char * and set "set"
        int length = strlen(toCopy) + 1;
        char * new_name = new char[length];
        strcpy(new_name, toCopy);

        delete set; //delete anything pointed to by this
        set = new_name;
        return 1;
}

另外我应该补充一下,只是为了避免问题,我正在使用cstring库,因为它是我正在上课的要求。我现在通过分析我的代码来超越...只是尽可能多地学习......谢谢!

2 个答案:

答案 0 :(得分:3)

常量字符串const char * name = "bunches, oates";传递给delete中的Customer::getName(char* &toReturn)

答案 1 :(得分:1)

首先,您应该尝试修复内存泄漏,除非您确定应用程序不会运行很长时间并且不会导致很多问题。但是,不要使用它来证明不修复它们。一旦你的应用变得更大,它们就会引发很多问题。

其次,我注意到你使用了C ++和C风格的字符串。最好使用stl :: string,因为它们已经管理了内存,而使用char *字符串你需要自己完成所有这些并且错误看起来很容易。