何时rvalue析构函数被称为/这是好的

时间:2017-11-25 18:39:40

标签: c++ oop c++11 destructor rvalue

下面的包装类是一种“OK”方式,可以让std::unique_ptr的中间对象无需复制me即可访问me成员吗?

以下是示例

#include <iostream>
#include <memory>

/* myobj from another library */
class myobj {
public:
    std::string me; /* actual member of interest is larger and more 
                       complicated. Don't want to copy of me or myobj */

    /* more members in actual class */

    myobj(std::string i_am) {
        /* more stuff happens in constructor */
        me = i_am;
    }

    ~myobj(){
        std::cout << me << ": Goodbye" << std::endl;
    }
};

/* A function in another library */
void who_is_this(std::string *who){
  std::cout << "This is " << *who << std::endl;
}

/* wrapper which I define */
class myobj_wrapper {
    using obj_ptr = std::unique_ptr<myobj>;
    obj_ptr ptr;

public:
    std::string *who;

    myobj_wrapper(std::string i_am): 
        ptr(new myobj(i_am)), who(&ptr.get()->me) {}

    myobj_wrapper(myobj &the_obj): who(&the_obj.me) { }
};

int main()
{
    {
        myobj bob("Bob");
        who_is_this(myobj_wrapper(bob).who); 
    }

    who_is_this(myobj_wrapper("Alice").who);

    return 0;
}

结果程序产生

This is Bob
Bob: Goodbye
This is Alice
Alice: Goodbye

我为多个对象定义myobj_wrapper以获取who指针。我不确定感兴趣的对象(上面的std::string)是否会在who_is_this函数中被评估之前被销毁。 从上面看似乎没有,但我应该期待这个吗?上述解决方案是否存在缺陷?

1 个答案:

答案 0 :(得分:1)

我不确定,但这是我的观点:

who_is_this(myobj_wrapper("Alice").who);

这将创建一个包装器对象,它将字符串文字作为参数。然后,将动态创建myobj实例,并将其移交给唯一指针。通过该实例,我们获取其数据(字符串),并从包装类指向它的传统指针。所以,现在who指向me,即Alice。

我们将who(这是一个指针)传递给:

void who_is_this(std::string *who)

表示函数的参数who 不是副本,但指向原始数据。

所以现在整个问题是当包装器对象超出范围时(因此它的数据成员(唯一指针)也将超出范围,这意味着已动态创建的myobj实例将被垃圾收集,这反过来意味着me也将超出范围,who也是如此。

who_is_this()执行后,包装器对象将超出范围,这意味着您的代码正常。