Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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++;返回临时对象 我有一个相当基础的C++问题:考虑一个函数,它需要输入参数,并创建一个 STD::String >下面的参数: std::string constructString( int some_parameter ) { std::stringstream ss; // Construct a string (arbitrarily complex) ss << "Some parameter is " << some_parameter << " right now"; return ss.str(); //Am I not returning a temporary object here? } std::string constructString(int some_参数){ std::stringstream-ss; //构造字符串(任意复杂) ss_C++_Temporary Objects - Fatal编程技术网

C++;返回临时对象 我有一个相当基础的C++问题:考虑一个函数,它需要输入参数,并创建一个 STD::String >下面的参数: std::string constructString( int some_parameter ) { std::stringstream ss; // Construct a string (arbitrarily complex) ss << "Some parameter is " << some_parameter << " right now"; return ss.str(); //Am I not returning a temporary object here? } std::string constructString(int some_参数){ std::stringstream-ss; //构造字符串(任意复杂) ss

C++;返回临时对象 我有一个相当基础的C++问题:考虑一个函数,它需要输入参数,并创建一个 STD::String >下面的参数: std::string constructString( int some_parameter ) { std::stringstream ss; // Construct a string (arbitrarily complex) ss << "Some parameter is " << some_parameter << " right now"; return ss.str(); //Am I not returning a temporary object here? } std::string constructString(int some_参数){ std::stringstream-ss; //构造字符串(任意复杂) ss,c++,temporary-objects,C++,Temporary Objects,您正在返回一个临时对象,但由于您按值返回它,因此将创建副本。如果您返回指向临时对象的指针或引用,那将是一个错误 如果将返回类型更改为const char*并返回ss.str().c_str(),您将返回指向由ss.str()返回的临时std::string缓冲区的指针这将很糟糕。如您所见,返回std::string对象。您返回std::string而不引用,这意味着没有RVO(NRVO)优化复制构造函数将调用并创建有效的std::string对象。使用优化std::string将在不使用复制构造

您正在返回一个临时对象,但由于您按值返回它,因此将创建副本。如果您返回指向临时对象的指针或引用,那将是一个错误


如果将返回类型更改为
const char*
并返回
ss.str().c_str()
,您将返回指向由
ss.str()返回的临时
std::string
缓冲区的指针
这将很糟糕。

如您所见,返回
std::string
对象。您返回
std::string
而不引用,这意味着没有RVO(NRVO)优化复制构造函数将调用并创建有效的
std::string
对象。使用优化
std::string
将在不使用复制构造函数的情况下移动。但是如果将返回
std::string&
,它将崩溃,因为此对象将在函数返回后被销毁。
const char*
beca也会产生同样的效果销毁后使用此指针将指向坏内存,这是危险的情况。

假设:
T val=some_function()< /代码>,当您使用指定的复制构造函数或内置运算符返回一个值从<代码>返回到< C++ >代码> > >代码> int >代码>或>代码> STD::String 根本没有问题,但是如果您返回一个指针,指针将指向函数结尾的内存。哦!!!你的指针将指向一个无效的内存。例如,考虑这个:

const char* some_function() {
    std::string res( ... );
    //...
    return res.c_str();
}

您返回的指针指向函数返回后将立即释放的数据(因为
res
将被销毁,它将释放其内部数据),因此您将获得地址,但该地址并不指向您可能期望的内容!

“C++将返回值的值复制到val中”-更重要的是,它已经将
ss.str()
返回的值复制到函数的返回值中,因为他是按值返回的。因此它甚至可以使用
const T&val=some_function()
,给定
some_function
按值返回。
const T&val=some_function()实际上工作得很好,因为C++按值复制所有的东西,而<代码> const t/<代码>实际上是代码> const t*<代码>,具有不同的语义,这里的问题是“代码> const t&和/c>指向函数调用完成后失效的位置!不,它不会,因为绑定了一个临时引用。临时的生存期。这就是为什么
void foo(const std::string&);foo(“test”);
工作得非常好。它对指针(或非常量引用)不起作用这是一个小小的区别,这使得引用实际上不是指针的语法糖。我告诉过你,当你调用
foo(“test”)时,这是一个具有不同语义的指针将创建一个<代码> STD::String ,然后将其指针作为函数的引用,但我们没有一个东西可以延长C++中对象的生命周期,这不是使用引用管理生命周期的C。例如,如果你有“代码> const STD::Strand and FoE():{STD::String TMP;返回TMP;}
,reference从不添加
tmp
的生存期,它将在函数结束时被销毁!但是如果您有
int&foo(){int n=5;返回n;}
语法无效,但它工作得很好,因为n仍然在内存中!!好吧,这个例子选得不好,因为临时的
std::string
一直持续到函数调用表达式的结尾。我也知道这不是C,引用/指针通常不会延长任何生存期。但这仍然是绑定到const r的方式引用有效。一旦我找到了标准证明,我会马上回来。调用constructString的函数不会提取该副本后是否会调用析构函数?因为它是临时对象,我假设指向它的指针作为返回值保存在堆栈上。返回后会发生什么?如果没有新的对象所有者,它会被销毁吗?c如何处理ompiler知道在返回对象后是否必须销毁该对象?