c ++使用指针时移动语义
c++ move semantics when using pointers
如何在使用原始指针时使用 move
赋值运算符。
除了做类似的事情还有其他方法吗:
void Function(T* dest)
{
T* src = LoadT();
(*dest) = std::move(*src);
delete src;
}
除非您引用临时变量中的对象,否则您就不走运了。从技术上讲(不确定是否非法),您可以提供自己的 move
专业化,您可以在其中隐藏该行为。但是在某一时刻,您必须取消对这些指针的引用。
你想让 指向对象彼此移动,那么你已经在correct/standard/only 方式,即 de-reference 指针然后 move *src
到 *dest
.
也就是说,您的界面是语义化的 'problematic'。指向函数的指针 按照约定 表示非拥有和可选的。所有权似乎不是这里的问题,但可选的是。既然可以使用引用,为什么还要使用指针呢?而且,当您只能使用 return 值时,为什么还要使用引用?
实际上你可以简化为:
T Function()
{
return LoadT();
}
然后让函数的用户决定如何最好地使用 T。如果 T 是多态的,您可以 return std::unique_ptr<T>
代替。
你的举动很好。 src指向的对象会被移动到dest指向的对象中。
关于您更新的代码示例,版本功能:
如果您的 LoadT() return 是指向用 new 分配的对象的原始指针,它不会存储在其他地方并在以后被删除,您将发生内存泄漏。
当你std::move某物时,你移动那个对象的内容,对象本身仍然存在,只有"empty"/无论你在移动后离开它的状态。
如果您 return 一个指向其他人拥有的对象的指针,并且将在此处看到的代码之外以某种方式被清理,您可以通过更改指向引用的指针来使其明确 - 那样您将明确指定:a) 保证指针不为空; b) 不必担心删除从 LoadT 获得的对象,因为引用不能拥有该对象的所有权。
如何在使用原始指针时使用 move
赋值运算符。
除了做类似的事情还有其他方法吗:
void Function(T* dest)
{
T* src = LoadT();
(*dest) = std::move(*src);
delete src;
}
除非您引用临时变量中的对象,否则您就不走运了。从技术上讲(不确定是否非法),您可以提供自己的 move
专业化,您可以在其中隐藏该行为。但是在某一时刻,您必须取消对这些指针的引用。
你想让 指向对象彼此移动,那么你已经在correct/standard/only 方式,即 de-reference 指针然后 move *src
到 *dest
.
也就是说,您的界面是语义化的 'problematic'。指向函数的指针 按照约定 表示非拥有和可选的。所有权似乎不是这里的问题,但可选的是。既然可以使用引用,为什么还要使用指针呢?而且,当您只能使用 return 值时,为什么还要使用引用?
实际上你可以简化为:
T Function()
{
return LoadT();
}
然后让函数的用户决定如何最好地使用 T。如果 T 是多态的,您可以 return std::unique_ptr<T>
代替。
你的举动很好。 src指向的对象会被移动到dest指向的对象中。
关于您更新的代码示例,版本功能:
如果您的 LoadT() return 是指向用 new 分配的对象的原始指针,它不会存储在其他地方并在以后被删除,您将发生内存泄漏。
当你std::move某物时,你移动那个对象的内容,对象本身仍然存在,只有"empty"/无论你在移动后离开它的状态。
如果您 return 一个指向其他人拥有的对象的指针,并且将在此处看到的代码之外以某种方式被清理,您可以通过更改指向引用的指针来使其明确 - 那样您将明确指定:a) 保证指针不为空; b) 不必担心删除从 LoadT 获得的对象,因为引用不能拥有该对象的所有权。