gpt4 book ai didi

c++ - 使用模板通过 void 指针调用析构函数

转载 作者:行者123 更新时间:2023-11-30 01:30:53 25 4
gpt4 key购买 nike

我写了一个类来包含我的对象。代码是:

class objectPool
{
private:
struct itemType_{uint count; void* object;};
std::multimap< std::string, itemType_ > pool_;

public:
template<class T>
bool addItem(std::string key, T*& object)
{
std::multimap< std::string, itemType_ >::iterator
i = pool_.find(key);
if(i != pool_.end())
{
object = (T*)(*i).second.object;
(*i).second.count++;
return true;
}
i = pool_.insert(std::pair<std::string,itemType_>(key, (itemType_){1, NULL}));
object = (T*)(*i).second.object;
return false;
}

template<class T>
bool removeItem(std::string key)
{
std::multimap< std::string, itemType_ >::iterator
i = pool_.find(key);
if(i != pool_.end())
{
if((*i).second.count == 1)
{
//important to call the appropriate destructor
delete ((T*)(*i).second.object);
pool_.erase(i);
}
else
(*i).second.count--;

return true;
}
return false;
}
};

和测试代码:

#include "objectPool.h"
class testClass
{
public:
~testClass()
{
// I should get here at least once
std::cout << "I am deleted teehee";
}
};


testClass* test;

objectPool myPool;

int main () {

if(!myPool.addItem<testClass>("baba", test))
{
test = new testClass;
}

myPool.removeItem<testClass>("baba");
}

出于某种原因,我的测试对象的析构函数不想被调用。第一个问题:为什么?我哪里错了?

教务长:我应该改用 auto_ptr 吗? (虽然我想避免使用模板...)

第三个:是否有更好(-looking)的解决方案? (使用或不使用模板)

第四.:有没有办法在没有模板的情况下(或者不知道原始类型)通过void指针调用构造函数?

提前致谢! :D对不起,我的英语很棒(不是我的母语,虽然......)

最佳答案

您正确地将 NULL 存储到 T* 引用中,但这是对局部变量的引用。当您稍后通过调用 new 更新该本地时,这对存储在池中的项目没有影响。

解决此问题的更简单方法是使用 new T 在 addItem 函数内创建对象。

至于你的另一个问题,在不知道原始类型的情况下调用析构函数的方法,没有办法做到这一点。但是有一个技巧可以与模板一起使用。您可以创建如下所示的模板函数,然后将函数指针传递给它。

template<typename T>
void deleter(void *ptr)
{
delete static_cast<T*>(ptr);
}

deleter 作为一种简单的类型,您可以对其进行类型定义并传递指针:

typedef void (*deleter_func)(void *);

要获得指向它的指针,只需在您的 addItem 函数中执行如下操作:

deleter_func myDeleter = &deleter<T>;

然后:

myDeleter(somePtr);

删除时不需要知道somePtr的类型,只需要保留一个指向删除者的指针即可。您还可以将此方法与 shared_ptr 一起使用,它可以使用 deleter 参数。

关于c++ - 使用模板通过 void 指针调用析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4008788/

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