0

如果我在函数的循环中初始化一个临时变量(比如一个 char *,而不是“new”),那么我是否需要显式释放它,或者当它超出范围时是否会处理它?后者是我被教导的......当我通过 Valgrind 运行我的代码时,我得到“15 个字节肯定丢失”,但它们似乎位于与上述类似的区域......超出范围的临时变量。这些不是用“新”分配的东西...... 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 库,因为它是我正在学习的课程的要求。在这一点上,我通过分析我的代码来超越自我……只是想尽可能多地学习……谢谢!

4

2 回答 2

3

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

于 2012-07-18T05:12:27.673 回答
1

首先,您应该尝试修复内存泄漏,除非您确定您的应用程序不会长时间运行并且它们不会引起很多问题。但是,不要以此为理由不修复它们。一旦您的应用程序变得更大,它们可能会导致很多问题。

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

于 2012-07-18T05:13:58.733 回答