什么时候调用右值析构函数/这样可以吗
When is rvalue destructor called / is this ok
下面的包装器 class 是一种 "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
函数中被评估之前被销毁。 从上面看似乎不是,但我应该这样吗?上述解决方案是否存在缺陷?
我不确定,但这是我的观点:
who_is_this(myobj_wrapper("Alice").who);
这将创建一个包装器对象,它将字符串文字作为其参数。然后,会动态创建一个myobj
实例,交给一个唯一的指针。通过该实例,我们获取它的数据(字符串),并使包装器 class 中的传统指针指向它。所以,现在 who
指向 me
,即 Alice。
我们将 who
(这是一个指针)传递给:
void who_is_this(std::string *who)
表示函数的参数who
不是的拷贝,而是指向原始数据
所以现在整个问题是包装器对象何时会超出范围(因此它的数据成员(唯一指针)也会超出范围,这意味着 myobj
实例已经动态created 将被垃圾收集,这反过来意味着 me
也会超出范围,who
.
也会超出范围
包装器对象将在 who_is_this()
执行后超出范围,这意味着您的代码没问题。
下面的包装器 class 是一种 "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
函数中被评估之前被销毁。 从上面看似乎不是,但我应该这样吗?上述解决方案是否存在缺陷?
我不确定,但这是我的观点:
who_is_this(myobj_wrapper("Alice").who);
这将创建一个包装器对象,它将字符串文字作为其参数。然后,会动态创建一个myobj
实例,交给一个唯一的指针。通过该实例,我们获取它的数据(字符串),并使包装器 class 中的传统指针指向它。所以,现在 who
指向 me
,即 Alice。
我们将 who
(这是一个指针)传递给:
void who_is_this(std::string *who)
表示函数的参数who
不是的拷贝,而是指向原始数据
所以现在整个问题是包装器对象何时会超出范围(因此它的数据成员(唯一指针)也会超出范围,这意味着 myobj
实例已经动态created 将被垃圾收集,这反过来意味着 me
也会超出范围,who
.
包装器对象将在 who_is_this()
执行后超出范围,这意味着您的代码没问题。