使用 std::分配器和 std::move 防止释放的正确方法
Proper way to prevent deallocation using std::allocator and std::move
正如标题所说,我想知道这是否是在将vector<T> a
移动到vector<T> b
时防止vector<T> a
中释放的正确方法。
矢量标头:
template<class T, class A = std::allocator<T>>
class vector
{
typedef typename A::size_type size_type;
A alloc;
T* start;
T* end;
public:
explicit vector(size_type n, const T& val = T(), const A& =A());
vector(vector&&);
~vector();
};
构造 函数:
注意:分配可以抛出std::bad_alloc
。
template<class T, class A>
vector<T,A>::vector(size_type n, const T& val, const A& a)
: alloc(a)
{
start = alloc.allocate(n); //allocate memory for n elements.
end = start + n;
for(auto p = start; p!=end; p++)
alloc.construct(p, val); //construct val at allocated memory.
}
移动构造函数:
问题:这是移动向量 v 的正确方法吗?
template<class T, class A>
vector<T,A>::vector(vector&& v)
:alloc(v.alloc) // copy the allocator in v.
{
start = std::move(v.start); // move the pointer previously returned by allocator.
end = std::move(v.end); // same boundary value.
v.start = v.end = nullptr; // nullptr to prevent deallocation when v is destroyed.
}
破坏者:
问:根据 cpp 首选项,allocator::deallocate(p, n)
从先前由 allocator
返回的指针中释放内存,并且n
必须等于为其分配的元素数。如果不是这种情况怎么办?我的回答是,如果指针或元素的数量n
不等于先前对allocator::allocate(n)
的调用,则allocator::deallocate
什么也不做。这是真的吗?
template<class T, class A>
vector<T, A>::~vector()
{
for(auto p = start; p!=end; p++)
alloc.destroy(p); //Destroy objects pointed to by alloc.
alloc.deallocate(start, end-start); //Deallocate memory.
}
这是移动向量 v 的正确方法吗?
看起来不错,但指针std::move
多余。此外,您不会释放end
,因此无需将其设置为 null。
如果不是这种情况怎么办?我的答案是,如果指针或元素数 n 不等于之前对 allocator::allocate(n) 的调用,则 allocator::d eassign 不执行任何操作。这是真的吗?
不,行为是未定义的。您必须通过相同的n
。
相关文章:
- 使用std::函数映射对象方法
- 初始化具有非默认构造函数的std::数组项的更好方法
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 绑定派生类方法C++从实例范围之外的分隔 std::function 变量调用
- 为什么 std::span 缺少 cbegin 和 cend 方法?
- 使 std::vector 分配对齐内存的现代方法
- std::find,返回所有找到的值的替代方法,而不仅仅是存在重复的向量的第一个值
- C++ STD 函数运算符:有没有一种方法可以通过函数将一个向量映射到另一个向量上?
- 如何访问存储在 std::variant 中的类的方法
- C++ assigment std::list:<typename>:itrator 在 main 中工作,但在方法中它不起作用
- 我无法使用C++指针指向类方法返回的 std::vector
- 在自定义 std::vector-like 容器中处理指针和非指针模板类型的最佳方法是什么?
- 静态 std::map instatiation 在类的方法中调用构造函数吗?
- C++:std::ofstream 方法 open() 在第二次迭代时擦除打开的 ifstream 文件
- 在 std::vector<无符号字符中存储任意数据的方法>
- 将 std:set<int32_t> 复制到 std::set <uint32_t>的好方法
- std::bind,无法让具有单个参数的方法工作
- 解决错误使用std方法/类时std标头中的错误
- 包装数据的STD方法
- 用STD方法对两个级数求和