【发布时间】:2020-11-04 06:41:19
【问题描述】:
我已经在代码中完成了这个任务:
const char* value = retCharPtrFunc();
必须改为:
const char* value;
if (true)
value = (retStringFunc()).c_str();
else
value = retCharPtrFunc();
由于某种原因,现在这段代码访问了比以前更多的堆内存(使用 Address Sanitizer)。
堆内存用于指针(动态分配)。看起来我没有比以前添加更多的内存,只是更改了分配。
编译器如何解释这些代码和分配内存有什么不同吗?
要添加更多详细信息: 两个函数返回的 char* 或字符串长度完全相同,只有少数字符不同,不会增加内存分配。
以下是函数的签名(如 cmets 中所要求的):
const char* retCharPtrFunc() const;
string retStringFunc() const;
期望行为:需要了解为什么变量相同但赋值不同时会消耗更多内存
【问题讨论】:
-
请出示
retCharPtrFunc的签名。 -
这些都不意味着它不是 UB,因为不幸的是,有时 UB 按预期工作。我也想看
retCharPtrFunc()的签名 -
这看起来真的像是在存储一个指向已释放字符串的指针。如果
retStringFunc的返回类型是std::string,那么你有一个悬空指针,并且访问它是UB。您可能会在其位置找到预期的字符串,但它可能随时被覆盖,从而导致奇怪的行为。不要依赖 UB。 -
请同时添加
retStringFunc的签名。正如 Richard Critten 所说:minimal reproducible example 请。