Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从返回的std::string的本地副本获取C-string_C++_Return Value Optimization - Fatal编程技术网

C++ 从返回的std::string的本地副本获取C-string

C++ 从返回的std::string的本地副本获取C-string,c++,return-value-optimization,C++,Return Value Optimization,我试图调试一个与std::string中包含的字符数组的作用域相关的问题。我已经在下面发布了相关的代码示例 #include <iostream> #include <string> const char* objtype; namespace A { std::string get_objtype() { std::string result; std::string envstr( ::getenv("CONFIG_STR") ); std::siz

我试图调试一个与std::string中包含的字符数组的作用域相关的问题。我已经在下面发布了相关的代码示例

#include <iostream>
#include <string>

const char* objtype;

namespace A
{

std::string get_objtype()
{
  std::string result;
  std::string envstr( ::getenv("CONFIG_STR") );
  std::size_t pos1 = 0, pos2 = 0, pos3 = 0;
  pos1 = envstr.find_first_of("objtype");
  if (pos1 != std::string::npos)
    pos2 = envstr.find_first_of("=", pos1+7);
  if (pos2 != std::string::npos)
  {
    pos3 = envstr.find_first_of(";", pos2+1);
    if (pos3 != std::string::npos)
      result = envstr.substr(pos2+1, pos3 - pos2 - 1);
  }
  const char* result_cstr = result.c_str();
  std::cerr << "get_objtype()" << reinterpret_cast<long>((void*)result_cstr) << std::endl;
  return result;
}

void set_objtype()
{
  objtype = get_objtype().c_str();
  std::cerr << "Objtype " << objtype << std::endl;
  std::cerr << "main()" << reinterpret_cast<long>((void*)objtype) << std::endl;
}

}

int main()
{
  using namespace A;
  std::cerr << "main()" << reinterpret_cast<long>((void*)objtype) << std::endl;
  set_objtype();

  if (::strcmp(objtype, "AAAA") == 0)
    std::cerr << "Do work for objtype == AAAA " << std::endl;
  else
    std::cerr << "Do work for objtype != AAAA" << std::endl;
}
我的问题是: 从main()和get_objtype()打印的指针值相同。这是因为RVO吗?
输出的最后一行显示,即使封闭的std::string超出范围,指向C-string的全局指针也可以。那么,返回的值何时超出范围,字符串数组何时被删除?感谢社区的任何帮助。谢谢。

指针值不会更改,但它指向的内存可能不再是字符串的一部分

objtype
set_objtype()
中设置后,该行无效,因为get_objtype()的结果不会保存在任何地方,因此编译器可以随时在那里终止它


它可能会工作,但它正在访问无效内存,因此它是无效代码,如果您依赖这样的东西,最终会遇到大问题。

您应该使用objdump查看反汇编,以检查其RVO是否正确


但是,从我做的实验(使结果全局化并复制它)来看,c_str似乎是引用计数的

get_objtype()中返回的字符串将在语句之后立即销毁。i、 在打分号之后。只是objtype指向的地址没有被任何其他数据覆盖。因此,您仍然看到“AAAA”的值。顺便说一句,您想通过这个示例实现什么?除非你正在做一些不同的事情,否则要使代码更简单、更容易。我试图理解一段现有的代码。在Mac OS 12.3上编译和执行?“什么时候出来的?”迈克尔。你没有得到这个输出吗?谢谢。那么编译器会在调用c_str()之前创建一个临时字符串吗?在第
objtype=get_objtype().c_str()行的分号之前,存在一个匿名字符串“existing”
get方法返回一个实际的字符串(在堆栈上)。
$ g++ -g -DNDEBUG -o A.exe A.cpp
$ CONFIG_STR="objtype=AAAA;objid=21" ./A.exe
main()0
get_objtype()140210713147944
Objtype AAAA
main()140210713147944
Do work for objtype == AAAA
$