C ++是函数参数临时函数的析构函数行为标准吗?

时间:2016-05-06 14:42:41

标签: c++ destructor temporary stackframe

我对C ++中的析构函数有一些特定的问题。解释我通过代码询问的内容要容易得多。基本上我想做类似的事情(但不完全是):

foo( bar().ptr );

在此示例中,指针指向从' bar()'返回的对象内的动态内存。我们可以假设指针是简单的char *。我想确保那些“ptr'在执行foo()期间指出了生命。现在来充实我在代码中的意思:

foo( char* ptr )
{
    // do stuff with *ptr
}

obj bar()
{
    obj thing;

    return thing;
}

struct obj
{
    char* ptr;

    obj()
    {
        ptr = new char[1];
    }

    ~obj()
    {
        delete[] ptr;
    }
};

现在,这在Visual Studio中无法完全优化。我是偏执狂,并希望对此有100%的信心。此代码还需要在Linux上运行(使用gcc编译)。严格来说是x86。

这有点微妙,所以我想我会问这个行为是否标准。看起来编译器会想要来确保这种方法有效。

谢谢!

1 个答案:

答案 0 :(得分:4)

是的,您有保证。临时工作一直持续到表达式结束,直到函数foo()返回为止。

从概念上讲,您的案例与

没有什么不同
void x(const char* );

x(std::string("String").c_str());

这是历史悠久的做法!

作为旁注,你的智能指针类写的非常糟糕,但我认为它只是为了说明而不是真正的代码。