【问题标题】:C++ Is destructor behavior standard for function argument temporaries?C ++是函数参数临时的析构函数行为标准吗?
【发布时间】:2016-05-06 14:42:40
【问题描述】:

我有一个关于 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。

这有点微妙,所以我想我会问一下这种行为是否是标准的。似乎编译器会想要确保它能够正常工作。

谢谢!

【问题讨论】:

    标签: c++ destructor temporary stack-frame


    【解决方案1】:

    是的,您有保证。临时变量会一直存在到表达式的末尾,也就是直到函数 foo() 在您的情况下返回。

    从概念上讲,您的情况与

    void x(const char* );
    
    x(std::string("String").c_str());
    

    这是由来已久的做法!

    顺便说一句,你的智能指针类写得非常糟糕,但我认为它只是为了说明,而不是真正的代码。

    【讨论】:

    • 哈哈,c_ptr() 好点!是的,上面的所有代码都只是提炼到最相关的部分。谢谢!
    • 附注到您的附注:示例智能指针类写得非常糟糕,它打破了这种用法。临时是(没有 RVO)错误地从一个函数本地构造的副本,该函数在使用临时之前被破坏。
    猜你喜欢
    • 1970-01-01
    • 2011-06-19
    • 2013-08-29
    • 2015-12-05
    • 2015-07-21
    • 1970-01-01
    • 2010-09-06
    • 2016-06-12
    • 2015-12-14
    相关资源
    最近更新 更多