C++:带有未知deleter的unique_ptr
C++: unique_ptr with unknow deleter
我需要编写一个函数来检索和处理一些数据。这些数据可以通过几种方式分配(在数据段、堆、共享内存段等):
T *data;
if( global ) data = &d;
if( heap ) data = new T [ size ];
if( shm ) data = (T*) shmat( id, 0, 0 );
// processing data ...
由于data
可能是动态分配的,我认为处理它的最佳方式是使用unique_ptr
或其他类型的智能指针。然而,它并不总是动态分配的:我需要在运行时为unique_ptr
选择deleter,但这是不可能的。
我应该如何定义和处理data
?
您可以让自定义deleter获取运行时值!
struct MyCustomDeleter
{
MemoryType type;
template <typename T>
void operator()(T* value) const
{
switch (type)
{
case MemoryType::heap:
delete[] value;
break;
case MemoryType::shm:
unmap_from_shm(value);
break;
// etc.
}
}
};
...
std::unique_ptr<T, MyCustomDeleter> ptr (new T[size],
MyCustomDeleter{MemoryType::heap});
我不确定std::unique_ptr
,但您可以使用std::shared_ptr
。它的自定义deleter不依赖于类模板参数。
除了KennyTm的好答案之外,另一种可能性是使用函数指针作为deleter,然后在运行时提供不同的函数:
typedef std::unique_ptr<T, void(*)(void*)> Ptr;
void delete_global(void*);
void delete_heap(void*);
// etc.
Ptr get(/* whatever */)
{
if ( ... )
return Ptr(data, delete_global);
if (... )
return Ptr(data, delete_heap);
// etc.
}
如果使用共享shared_ptr<>
,则可以在运行时选择deleter。只要你不复制/。。。则CCD_ 8应当表现为与CCD_。
使用您自己的智能指针和您选择的deleter:
enum DataPointerType
{
Stack,
Dynamic,
SharedMem,
...
};
template <class T>
class DataPointer
{
public:
DataPointer(T* pointer, DataPointerType type)
: _ptr(pointer), _type(type)
{ }
~DataPointer()
{
switch (type) {
case Stack: break;
case Dynamic: delete _ptr; _ptr = nullptr; break;
...
}
}
T& operator*() { return *_ptr; }
const T& operator*() const { return *ptr; }
T* operator->() { return _ptr; }
const T* operator->() const { return ptr; }
private:
T* _ptr;
DataPointerType _type;
// Prevent copying and destruction, dangerous
DataPointer(const DataPointer& other);
DataPointer& operator=(const DataPointer& other);
};
相关文章:
- 为什么 std::unique 不调用 std::sort?
- CLANG 编译器 说:变量"PTR"可能未初始化
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- 为共享 ptr 向量实现复制 c'tor?
- 字符和整数中 **(ptr+1) 的值差异
- C++:在不中断共享的情况下通过引用传递共享 PTR?
- 生成"unique"矩阵
- 如何将派生类从基 ptr 分配给 nlohmann::json
- 引用 std::shared:ptr 以避免引用计数
- 我对 std::unique(算法)C++有问题
- 为什么我不能在不进行任何转换的情况下将浮点数放入任何类型的 ptr 中?
- 在调用函数时,ptr** 和 ptr*& 之间是否有区别,或者首选C++?
- 另一种类型的智能ptr,比如具有弱refs的unique_ptr
- 尝试打印出 *ptr++ 的值,以了解它是如何工作的
- 如何控制共享 ptr 引用计数?
- std::shared_ptr::unique(),复制和线程安全
- 如何在C++03中用自定义谓词调用std::unique
- C++中的指针否定 (!ptr == NULL)
- C++14 unique_ptr并使用已删除的函数'std::unique-ptr' unique_ptr错误