超出范围问题?

问题描述 投票:0回答:1

我使用的框架已经在 CentOS 7 上运行了多年。我们正在将其迁移到 RHEL 8,但一些单元测试失败了。其中一个特别涉及从 std::runtime_error 上的 What() 返回垃圾。我创建了一个非常简单的例子来重复这个问题。它可以在 CentOS7 上运行,但不能在 RHEL 8 上运行。代码如下:

#include <sstream>
#include <iostream>

const char * getString() {

    std::ostringstream oss;
    oss << "some stuff to return" << std::endl;

    std::cout << "value to return: " << oss.str().c_str() << std::endl;

    return oss.str().c_str();
}

int
main(int argc, char ** argv) {

    std::string value = getString();
    std::cout << "value returned: " << value << std::endl;

    return 0;
}

CentOS7 的输出是:

[user@localhost ~]$ ./a.out
value to return: some stuff to return

value returned: some stuff to return

而 RHEL8 上的输出是:

[user@localhost badoverload]$ ./a.out
value to return: some stuff to return

value returned: `

该值是否超出范围且不可用,但在 CentOS 7 中内存恰好未受影响?还是有其他事情发生?

c++ lifetime stringstream
1个回答
0
投票

getString()
返回一个悬空指针。
std::string
返回的
str()
被销毁,当

std::string value = getString();

从指针读取,未定义的行为是事实。

只需返回

std::string
而不是
const char*

© www.soinside.com 2019 - 2024. All rights reserved.