首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >堆栈上的C++变量似乎未在函数作用域末尾释放

堆栈上的C++变量似乎未在函数作用域末尾释放
EN

Stack Overflow用户
提问于 2018-06-10 07:38:32
回答 1查看 64关注 0票数 1

我编写了以下简短的代码来进行实验,并尝试在对象调用其构造函数和析构函数时获得“第一手”体验:

代码语言:javascript
复制
class Foo
{
public:
    Foo(int bar)
    {
        this->bar = bar;
        std::cout << "Standard constructor called" << std::endl;
    }
    ~Foo()
    {
        std::cout << "Standard destructor called" << std::endl;
    }
    Foo(const Foo &foo)
    {
        std::cout << "Copy constructor called" << std::endl;
        this->bar = foo.bar;
    }
    inline int get_bar() { return bar; }
private:
    int bar;
};

Foo make_foo(int bar)
{
    Foo f1(bar);
    std::cout << "About to return foo with address of: " << &f1 << std::endl;
    return f1;
}

int main()
{
    Foo f2 = make_foo(3);
    std::cout << "New variable has address of: " << &f2 << std::endl;
    std::cout << "And a value of " << f2.get_bar() << std::endl;
}

但是当我运行这段代码时,我发现一些奇怪的事情发生了。与预期一样,打印“标准构造函数调用”,并打印该函数中foo的地址。但是当函数结束时,不会调用析构函数,并且f2实际上具有与f1相同的内存地址,尽管根据我的理解,f1应该已经超出了作用域并释放了内存,因为它在堆栈上,对吧?或者在这种情况下这不是预期的结果吗?

我的预期是,为了将f1复制到f2,将调用复制构造函数,然后f1将调用其析构函数,f2将占用不同的内存地址。

如果有人对此感到好奇,下面是实际输出:

代码语言:javascript
复制
Standard constructor called                                                                          
About to return new foo with address of: 0x7fff518e5a88                                              
New variable has address of: 0x7fff518e5a88                                                          
And a value of 3                                                                                     
Standard destructor called     

有趣的是,当我将make_foo的返回类型更改为引用类型时,函数几乎按照我预期的那样执行,f1被析构,f2复制垃圾数据。

这是不是一些特殊的情况,堆栈上的一个变量在被返回给另一个我应该知道的变量时,不会释放内存?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-10 07:44:42

编译器正在执行返回值优化(RVO)。你可以在这里阅读到:https://en.wikipedia.org/wiki/Copy_elision#Return_value_optimization

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50779429

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档