具有发布的std :: vector <>的自定义分配器?

问题描述 投票:2回答:3

我正在使用C ++中的第三方C 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;
    }
}

还有更好的方法吗?

UPDATE 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

UPDATE 2:尝试创建一个MyOwningAllocator和一个MyNonOwningAllocator,然后在“发布时间”从拥有者交换到非拥有者,但是由于它们是不同类型而无法让swap()起作用。 >

我正在使用C ++中的第三方C API集,该讨论有两种关注的方法:它等效于malloc():the_api_malloc(size)(加上匹配的the_api_free())中的一个函数...] >

c++ stl allocator
3个回答
1
投票

而不是尝试使矢量停止调用分配器的自由函数,我将把您的release作为分配器的成员,并设置了一个标志。设置该标志后,the_api_free会简单地返回(即充当点)。


1
投票
vector::swap会将已分配块的所有权转让给另一个vector。但是,无法阻止向量在其析构函数中调用vector::allocator_type::deallocate,也没有可移植的方式直接修改内部指针。

0
投票
我不知道您是否能够完成实现,但是我能够在其他SO answer中使用现代C ++来为同一问题编写解决方案。
© www.soinside.com 2019 - 2024. All rights reserved.