gpt4 book ai didi

c++ - 带发布的 std::vector<> 的自定义分配器?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:00:10 26 4
gpt4 key购买 nike

我正在使用 C++ 中的第 3 方 C API 集,该 API 有两种与此讨论相关的方法:

  1. 它等同于 malloc():the_api_malloc(size)(加上匹配的 the_api_free())
  2. 一个函数,其中返回使用 the_api_malloc() 创建的内存并在内部拥有它和 the_api_free() 的所有权:the_api_give_back(ptr)

我创建了一个自定义分配器,包装了 the_api_malloc() 和 the_api_free() 以与例如 std::vector 一起使用。这很好用。

我想做的是有一个 std::vector 类型的类,它利用我的自定义分配器,但也有一个 release() 方法,当被调用时,释放它的内存所有权,因此不会调用我的自定义分配器 the_api_free ().

pointer release() /* pointer is of T* */

示例用法:

MyClass myClass(1024); // the_api_malloc()'s 1024 bytes
// ... do something with myClass
the_api_give_back(myClass.release());

我不确定实现这一目标的最佳方式。作为实验,我现在拥有的东西相当讨厌:

class MyClass : public std::vector<char, MyAllocator<char> > {
public:
using typename std::vector<char, MyAllocator<char> >::pointer;

pointer release() {
// note: visual studio impl.
pointer p = this->_Myfirst;
this->_Myfirst = 0;
this->_Mylast = 0;
this->_Myend = 0;
return p;
}
}

有没有更好的办法?

更新 1:这是我根据以下建议尝试过的方法。这也应该有助于说明所需的行为及其当前失败的地方。

template <class T>
class MyAllocator
{
public:
// types omitted for clarity

MyAllocator() : m_released(false) { }

template <class U>
MyAllocator(MyAllocator<U> const& a) : m_released(a.m_released) { }

// other ctors, dtors, etc. omitted for clarity

// note: allocate() utilizes the_api_malloc()

void deallocate(pointer p, size_type num)
{
if(!m_released) {
the_api_free(p);
}
}

void release_ownership() { m_released = true; }

bool m_released;
};

template <typename T>
char* ReleaseOwernship(T& container)
{
container.get_allocator().release_ownership();
return &container[0];
}

// usage:
{ // scope
std::vector<char, MyAllocator<char> > vec;

// ...do something to populate vec...

char* p = ReleaseOwnership(vec);
the_api_give_back(p); // this API takes ownership of p and will delete it itself
} // end scope - note that MyAllocator::deallocate() gets called here -- m_release is still false

更新 2: 尝试创建一个 MyOwningAllocator 和一个 MyNonOwningAllocator,然后在“发布时间”从拥有位置交换到非拥有位置,但无法让 swap() 按原样工作不同的类型。

最佳答案

我不会尝试停止 vector 调用分配器的自由函数,而是将您的 release 作为分配器的成员,并让它设置一个标志.设置标志后,the_api_free 将简单地返回(即充当 nop)。

关于c++ - 带发布的 std::vector<> 的自定义分配器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3580120/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com