1

我有一个模板类(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 >函数背后的实现是有效的(取自此处),但是只要我在 Key 或 Value 上按 delete,我就会得到以下信息:

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_cast, dynamic_cast,reinterpret_cast等,但这些似乎都不起作用。

什么是好的解决方案?

4

3 回答 3

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

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

此外,您的代码不起作用if,因为您无论如何都编译了死代码分支,因为您没有使用专业化。

于 2012-05-12T02:43:34.857 回答
2

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

于 2012-05-12T02:39:34.863 回答
0

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

于 2012-05-14T11:00:40.280 回答