Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果指针是模板值,如何删除它?_C++_Memory Management - Fatal编程技术网

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

C++ 如果指针是模板值,如何删除它?,c++,memory-management,C++,Memory Management,我有一个模板类节点是BST中的一个内部类。现在是释放内存的时候了;考虑到键或值或两者都可能是指针,我必须找出如何释放它们 请参见一个示例: ~Node( void ) { if ( is_pointer< TValue >( Value ) ) { delete Value; Value = NULL; } if ( is_pointer< TComparable >( Key ) ) {

我有一个模板类节点是BST中的一个内部类。现在是释放内存的时候了;考虑到键或值或两者都可能是指针,我必须找出如何释放它们

请参见一个示例:

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

    if ( is_pointer< TComparable >( Key ) )
    {
         delete Key;
         Key= NULL;
    }
}
我试过静态、动态、重新解释等等,但这两种方法都不起作用


什么是好的解决方案?

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

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

I must figure out how to free them if they are.
不要。真的,不要。这是用户的问题——如果他想要这种行为,他可以提供一个智能指针。毕竟,如果我想映射非拥有指针呢?或者需要自定义删除器

此外,您的代码不起作用,因为您编译了死代码(如果仍然存在分支),因为您没有使用专门化

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


此外,您的代码不起作用,因为您编译的是死代码,因为您没有使用专门化。

这实际上取决于您使用的是哪种软件。除非是一些快速测试,并且您不打算重用代码,否则是的,不要麻烦区分指针和对象或数组。但是,如果您正在编写库代码,并且您认为您的组件将被其他人重用,那么您应该注意自己之后的清理。STL vector自诞生之日起就成功地实现了这一目标。上一次我看到的代码是,他们为向量的第一个、最后一个元素调用Destroy函数,并将值标记作为第三个参数传递到函数中。如果元素只是表示int*的平面标量指针,则不需要调用析构函数。很明显,真实数据是由用户分配的,并且只有数据的地址存储在向量中,因此不应该取消分配。但是,如果是存储在用户定义类(例如,类a)的向量对象中的对象,那么就需要为向量~a中的每个元素调用析构函数,并且在所有元素都运行到最后之后,应该通过使用向量分配器来释放用于存储元素的连续内存块。要了解更多信息,您可以轻松打开vectors implementation,它们都在头文件中,请查看~vector implementation并让它指导您。

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

旁注:尝试将null赋值,然后删除没有意义。删除值;值=空;旁注:试图将null赋值然后删除是没有意义的。删除值;值=空;看起来会更好。是什么删除了它?在这种情况下是否存在自动内存管理?问题是谁负责对象。也许您的预期使用模式是,您的节点类总是负责对象的创建。试着使用你自己的课程,看看你的期望是什么。您很有可能会发现,节点并不意味着节点需要删除该值所指向的任何内容,也就是说,在一个大字符串上,节点指向其中的随机位置。您可能希望明确指定所有权
,但在节点类中可能需要T*值…是什么删除了它?在这种情况下是否存在自动内存管理?问题是谁负责对象。也许您的预期使用模式是,您的节点类总是负责对象的创建。试着使用你自己的课程,看看你的期望是什么。您很有可能会发现,节点并不意味着节点需要删除该值所指向的任何内容,也就是说,在一个大字符串上,节点指向其中的随机位置。您可能希望显式地指定所有权,但很可能在节点类中需要T*值……我认为这行不通。用户应该能够从BST中删除节点。因此,如果它类似于:BST->橡皮擦节点专用_键,那么如果用户必须首先找到节点,然后知道值的数据类型,他/她将执行~Value和内存释放,然后才可以销毁节点,这看起来会很奇怪。区分标量指针和非标量数据类型以及实现自定义删除器都非常容易,我认为用户不应该遭受这样的不协调。我认为这不会起作用。用户应该能够从BST中删除节点。因此,如果它类似于:BST->橡皮擦节点专用_键,那么如果用户必须首先找到节点,然后知道值的数据类型,他/她将执行~Value和内存释放,然后才可以销毁节点,这看起来会很奇怪。区分标量指针和非标量数据类型以及实现自定义删除器都非常容易,我认为用户不应该遭受这种不协调。
I must figure out how to free them if they are.