c++ - 如何在不调用模板化值析构函数的情况下将模板化值插入 std::map?
问题描述
我有一个非常简单的内存管理器。ConstructObject 函数将 ObjectInfo 插入 m_ObjectInfoMap。但我这样做的方式是调用 ObjectInfo 析构函数。如何更改功能以防止这种情况发生?我想我可以使用指针 (ObjectInfo* pObjectInfo = new ObjectInfo()) 并将其插入到地图中,但我试图避免调用 new 运算符。
#define CONSTRUCT(T) static_cast<T*>(ObjectFactory::ConstructObject<T>( #T ))
#define DESTRUCT(object) ObjectFactory::DestructObject( object )
//dummy class so we can have a templated class as value to a map
class OObjectInfoInterface
{
};
template<class T>
class ObjectInfo : public OObjectInfoInterface
{
public:
ObjectInfo(){
m_Object = NULL;
m_Name = NULL;
m_Size = 0;
}
~ObjectInfo();
T* m_Object;
//used for things like memory profiling
const char* m_Name;
size_t m_Size;
};
template<class T>
ObjectInfo<T>::~ObjectInfo()
{
delete m_Object;
}
class ObjectFactory
{
public:
template <typename T>
static OObjectInterface* ConstructObject( const char* pName )
{
T* pNewObject = new T();
ObjectInfo<T> objectInfo;
objectInfo.m_Object = pNewObject;
objectInfo.m_Name = pName;
m_ObjectInfoMap[pNewObject] = objectInfo;//<--causes destructor of ObjectInfo to be called (which deletes pNewObject)
return pNewObject;
}
void ObjectFactory::DestructObject( void* pObject )
{
if ( pObject )
{
TObjectInfoMap::iterator it = m_ObjectInfoMap.find( pObject );
if ( it != m_ObjectInfoMap.end() )
{
m_ObjectInfoMap.erase(pObject);
}
else
{
LOG_ASSERT( 0, "object not found!");
}
}
}
};
解决方案
推荐阅读
- python - 如何安装 conda python 包
- java - 查找 Java 类中使用的所有方法
- php - 日期输入类型的奇怪输出格式
- java - ping 数千个 url 的 Java 程序
- winapi - Pywin32:无法将 win32api.SendMessage 发送到 DOS 框程序?
- python - Pandas read_sql() 不返回全部值,减小大小
- node.js - 符号链接始终指向其父目录
- html - 将动态类名添加到 React 中的硬编码类列表中
- python - 当鼠标在小部件上时如何显示突出显示的标签
- ios - 将 RealityKit 框架导入项目会使旧设备崩溃