gpt4 book ai didi

c++ - 我应该多认真对待 Valgrind 和小内存泄漏(比方说 < 100 字节)?

转载 作者:行者123 更新时间:2023-11-30 02:03:40 25 4
gpt4 key购买 nike

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

最佳答案

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

关于c++ - 我应该多认真对待 Valgrind 和小内存泄漏(比方说 < 100 字节)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11534459/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com