【问题标题】:c++: when is a temporary object destructed [duplicate]c ++:何时销毁临时对象[重复]
【发布时间】:2015-12-11 10:18:09
【问题描述】:

有一些情况:
案例一:

string("test");
int i = 1;

这是一个临时对象。我们一到达int i = 1;,它就会被销毁。我说的对吗?

案例2:

const char * p = string("test").c_str();
int i = 1;
cout<< p;

我认为当我们到达int i = 1; 时 p 会指向一个非法内存。但我总是可以cout 正确的字符串。我只是幸运还是 p 不违法?

案例3:

void fun()
{
    throw Exception("error");
}

int main()
{
    try
    {
        fun();
    }catch(const Exception & e)
    {
        cout << e.description();
    }
}

我们可以在函数中throw 一个临时对象并在其更高级别的函数中使用 const 引用捕获它吗?

【问题讨论】:

  • 您知道,您可以轻松地检查所有这些情况,只需实现这些情况,然后调试应用程序...
  • @rbaleksandar 不是。您最终可能会得到一些似乎适用于您的特定编译器和运行时但实际上是未定义行为的东西。

标签: c++ temporary-objects


【解决方案1】:

临时对象何时销毁

完整表达式完成后。

案例一:

字符串(“测试”);诠释 i = 1;这是一个临时对象。这将是 我们一到达 int i = 1; 就被破坏了。我说的对吗?

是的

案例2:

const char * p = string("test").c_str();诠释 i = 1; cout

会的

但我可以 总是找出正确的字符串。我只是幸运还是 p 不违法?

因为在 std::cout 的情况下,完整的表达式只在分号之后完成。

我们可以在函数中抛出一个临时对象,并在其更高级别的函数中使用 const 引用捕获它吗?

是的,您可以:This 链接很好地解释了 异常对象 的生命周期。我认为当异常被捕获时异常表达式结束(但这只是一种思考方式)。

【讨论】:

    【解决方案2】:

    在情况 1 和 2 中,一旦评估了临时对象所在的完整表达式,就会破坏临时对象。在情况 1 中是语句结束的时间。

    在情况 2 中,不,你不走运,这是 未定义的行为,它似乎正在工作只是 UB 的可能性之一。 p>

    至于案例 3,C++ 会在整个异常处理过程中自己确保有一个有效的实例,并且异常处理程序可以引用该实际实例。

    【讨论】:

    • “你有一个对那个实际对象实例的引用” 是不是实际的异常对象是从抛出的对象复制初始化的(可能被忽略或移动)?
    • 关于情况2,好像const引用可以延长临时对象的生命周期……你确定是UB吗?
    • @PiotrSkotnicki 这可能是真的,我会改写。
    • @Thomas 是的,我敢肯定,没有对实际临时对象的 const 引用。如果它是例如,那将是不同的。 const std::string&amp; s = string(...);
    • 哦,是的。你是对的。
    猜你喜欢
    • 2015-01-10
    • 1970-01-01
    • 2016-09-08
    • 1970-01-01
    • 2019-08-19
    • 2014-02-07
    • 2013-10-24
    • 2014-11-24
    • 2019-07-27
    相关资源
    最近更新 更多