【发布时间】:2016-07-07 03:56:56
【问题描述】:
我了解如何移动对象,例如:
int a(5), b(6);
int c(std::move(a)); // move constructor
c = std::move(b); // move assignment
我了解自定义移动构造函数的常见实现(它获取动态指针的所有权并将移动的指针设置为nullptr。)
但我还没有找到任何关于移动动态分配的指针本身的信息。我需要确认以下代码是否合法:
int *p(new int(42));
int val(std::move(*p));
delete p; // I think this is no longer necessary. Is it?
那么,是否允许移动动态指针?
【问题讨论】:
-
说得非常非常简单——普通指针是愚蠢的。它们没有或不需要移动语义,因为它们只是一个愚蠢的指针。他们从来没有真正“拥有”任何东西,他们不会自动释放任何东西,除了他们自己(即指针,而不是指向的东西)。你打电话给
new。你要么必须打电话给delete,要么有一些东西可以打电话给delete,因为你拥有你分配的东西的所有权。这段代码都不做,所以它会泄漏。