如果它是模板值,如何删除指针?

时间:2012-05-12 02:30:46

标签: c++ memory-management

我有一个模板类(Node是BST中的内部类)。现在是释放记忆的时候了;鉴于键或值(或两者)可能是指针,我必须弄清楚如何释放它们。

查看示例:

~Node( void )
{
    if ( is_pointer< TValue >( Value ) )
    {
         delete Value;
         Value = NULL;
    }

    if ( is_pointer< TComparable >( Key ) )
    {
         delete Key;
         Key= NULL;
    }
}

is_pointer< T >函数背后的实现有效(取自here),但是只要我在Key或Value上按删除,我就会得到以下结果:

Error   13  error C2440: 'delete' : cannot convert from 'esc::Shader' to 'void *'   c:\programming\c++\git\escalator\engine\engine\searchtree.hpp   131
Error   14  error C2440: 'delete' : cannot convert from 'esc::ShaderComparable' to 'void *' c:\programming\c++\git\escalator\engine\engine\searchtree.hpp   137
Error   12  error C2679: binary '=' : no operator found which takes a right-hand operand of type 'int' (or there is no acceptable conversion)   c:\programming\c++\git\escalator\engine\engine\searchtree.hpp   130

我已尝试static_castdynamic_castreinterpret_cast等,但这些都不起作用。

什么是好的解决方案?

3 个答案:

答案 0 :(得分:4)

I must figure out how to free them if they are.

别。真的 - 不要。这就是用户的问题 - 如果他想要这种行为,他可以提供智能指针。毕竟,如果我想映射非拥有指针怎么办?或者需要自定义删除器?

此外,您的代码无效,因为您无论如何编译死代码if分支,因为您没有使用专门化。

答案 1 :(得分:2)

看起来你正在存储类型为T的元素的副本而不是常用的指针。如果您的声明为T Value;,则Node类通常不负责删除Value对象。

答案 2 :(得分:0)

这实际上取决于您在这里使用的软件类型。除非它是一些快速测试并且您不打算重用代码,否则,不要打扰区别对象或数组的指针。但是如果您正在编写库代码并且您认为您的组件将被其他人重复使用,那么您应该在自己之后注意清理。自从时代开始以来,STL矢量一直在成功地实现这一目标。最后我看到了代码,他们一直在调用向量的(First,Last)元素的Destroy函数,并将值标记作为第三个参数传递给函数。如果元素只是平面标量指针(例如int *),则不需要调用析构函数。显然,实际数据已由用户分配,并且只有数据的地址已存储在向量中,因此不应将其解除分配。但是如果它是存储在向量中的对象(例如,用户定义的类的对象,类A,那么就说),那么需要为向量中的每个元素调用析构函数~A()并在它们全部运行之后最后,应该通过使用向量分配器来释放用于存储元素的连续内存块。有关更多信息,您可以轻松打开向量实现,它都在头文件中,查看~vector()实现并让它指导您。