我正在使用C ++中的第三方C API集,该讨论有两种关注的方法:
我创建了一个自定义分配器,用于包装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())中的一个函数...] >
而不是尝试使矢量停止调用分配器的自由函数,我将把您的release
作为分配器的成员,并设置了一个标志。设置该标志后,the_api_free
会简单地返回(即充当点)。
vector::swap
会将已分配块的所有权转让给另一个vector
。但是,无法阻止向量在其析构函数中调用vector::allocator_type::deallocate
,也没有可移植的方式直接修改内部指针。