首页 新闻 会员 周边

C++ 自定义allocator这段代码如何通过编译

0
[待解决问题]
#include<bits/stdc++.h>
#include<bits/ptr_traits.h>
using namespace std;
int val;
struct my_iterator{
	using element_type = int;
	using value_type = int;
	using reference = int&;
	using pointer = int*;
	using difference_type = ptrdiff_t;
	using iterator_category = random_access_iterator_tag;
	int pos;
	my_iterator () = default;
	my_iterator (int pos_ ) : pos(pos_){}
	int& operator *(){
		return val;
	}
	friend bool operator  != (const my_iterator & a, const my_iterator& b){
		return a.pos != b.pos;
	}
	void operator ++(){
		++pos;
	}
	operator bool(){
		return pos != 0;
	}
};
template<typename T>
struct myallocator{
	using value_type = T;
	using pointer = my_iterator	;
	myallocator(){}
	template<typename U> myallocator(const myallocator<U>&&) {}
	pointer reallocate(size_t count){
		return my_iterator(0);
	}
	void deallocate(pointer p, size_t count){
		;
	}
};
int main(){
	vector<int, myallocator<int> > v;
        v.push_back(1);
}
C++
CDsidi的主页 CDsidi | 菜鸟二级 | 园豆:202
提问于:2023-02-08 21:10
< >
分享
所有回答(1)
0

这段代码存在一些问题,可能会造成编译错误或不符合内存管理规范:

  1. 在C++ std库中,并没有 bits 头文件,头文件名称一般为 <iostream>, <cstdio> 等。所以应该包含正确的头文件。

  2. <bits/ptr_traits.h> 头文件包含了 std::pointer_traits<> 模板类,这个模板类可以用来访问指针类型的一些属性。但是在这段代码中并没有使用这个类,因此可以考虑删除包含此头文件的语句。

  3. my_iterator 结构体中,声明了一个名为 val 的全局变量,但 val 在代码中并没有定义。因此,这段代码会造成编译错误,请定义或者删除不必要的成员变量。

  4. my_iterator 结构体中重载了如下运算符:

    • operator*():定义了解引用运算符,返回 val,这里可能是为了测试使用,实际中应该返回指向正在迭代的元素的指针。

    • operator++():定义了前置自增运算符,将指针位置加一,使得迭代器指向下一个元素。

    • operator!=():因为 STL 容器通常使用 != 来比较迭代器对象是否相等,所以在这里进行了重载。

    • operator bool() 的目的不太清楚,在迭代器中应该不存在返回布尔值的转换函数吧。

  5. my_allocator 结构体中实现了 reallocate() 函数和 deallocate() 函数,然而它们与 STL 中适配器所需的分配和释放函数并不兼容,无法完成需要的功能。

GOD_HJ | 园豆:204 (菜鸟二级) | 2023-05-02 10:20
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册