如果我在函数的循环中初始化一个临时变量(比如一个 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 库,因为它是我正在学习的课程的要求。在这一点上,我通过分析我的代码来超越自我……只是想尽可能多地学习……谢谢!