【问题标题】:Does the method of assignment change how memory is allocated?分配方法会改变内存的分配方式吗?
【发布时间】: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 请。

标签: c++ c++11 pointers memory


【解决方案1】:

如 cmets 中所述,您在临时字符串上调用 .c_str();临时被破坏,现在 C 字符串指针无效。

您应该将retStringFunc() 的结果保存在一个变量中。并且您需要确保在使用 value 时此变量不会超出范围。

std::string s;
const char *value;
if (true) {
    s = retStringFunc();
    value = s.c_str();
} else {
    value = retCharFunc();
}

【讨论】:

    猜你喜欢
    • 2017-06-10
    • 2019-02-11
    • 1970-01-01
    • 2020-02-01
    • 2011-12-02
    • 2018-05-20
    • 2015-04-16
    • 2023-03-10
    • 1970-01-01
    相关资源
    最近更新 更多