我们有一个简单的类,它使用placement new为指针分配内存,然后在适当的位置构造值。一切都好(我希望)。
兴趣点是移动构造函数。当我交换两个对象之间的指针(让它们称为A和B,A由B构造)时,A中的指针现在是拥有指针,B中的指针不是拥有指针。那么A中的析构函数将处理清理,但是B中的析构函数会阻塞,因为它会尝试删除一个非拥有指针(不用new分配)。我通过添加if语句来检查大小是否为零(表示尚未创建的对象)。
然而,当我编译并运行它时,控制台就冻结了。我似乎无法找到问题所在。
#include <iostream>
#include <cstddef>
#include <utility>
using std::size_t;
template<typename T>
class foo
{
private:
T* p = nullptr;
size_t sz = 0;
public:
foo(T* first, T* last)
: p(nullptr), sz(static_cast<size_t>(last - first))
{
p = static_cast<T*>(::operator new(sz * sizeof(T)));
for (size_t i = 0; first != last; ++first, ++i) {
::new(static_cast<void*>(&p[i])) T(*first);
}
}
foo(foo&& rhs) noexcept
{
std::swap(p, rhs.p);
std::swap(sz, rhs.sz);
}
~foo()
{
if (sz != 0)
{
for (size_t i = 0; i < sz; ++i) {
(&p[i])->~T();
}
::operator delete(static_cast<void*>(p));
}
}
};
int main()
{
int arr[5] = { 1, 2, 3, 4, 5 };
foo<int> f(arr, arr + 5);
foo<int> f2 = std::move(f);
}