Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.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++_Pointers - Fatal编程技术网

C++ 如何处理模板类中的指针?

C++ 如何处理模板类中的指针?,c++,pointers,C++,Pointers,当考虑像二进制树这样的模板化数据结构时,处理指针类型的最干净的方法是什么 如果树包含指针,则在删除子树时必须将指针指向的内存返回堆。但是我如何从BinaryTree类内部判断它是由malloc还是new分配的呢 一种解决方案是设置标志,指示存储的数据类型。但我的班级将依靠外部的正确用法 另一个想法是将某种向量传递给可能删除子树的所有二进制树方法。无论何时删除一个子树,它都会将存储的数据添加到向量中,最终我可以从二进制树外部正确地处理它们 但对我来说,这听起来像是一个麻烦的解决方案,可能有更好的方

当考虑像二进制树这样的模板化数据结构时,处理指针类型的最干净的方法是什么

如果树包含指针,则在删除子树时必须将指针指向的内存返回堆。但是我如何从BinaryTree类内部判断它是由malloc还是new分配的呢

一种解决方案是设置标志,指示存储的数据类型。但我的班级将依靠外部的正确用法

另一个想法是将某种向量传递给可能删除子树的所有二进制树方法。无论何时删除一个子树,它都会将存储的数据添加到向量中,最终我可以从二进制树外部正确地处理它们


但对我来说,这听起来像是一个麻烦的解决方案,可能有更好的方法。

使用共享指针(
boost::shared_ptr
std::shared_ptr
来自c++11)将数据存储在树中。

使用共享指针(
boost::shared_ptr
std::shared_ptr
)用于在树中存储数据。

这里有几个问题。我回答“但是我如何从BinaryTree类内部判断它是由malloc还是new分配的?”


答案很简单<强>不要将C++ OLC(new /DELL)与C OLLC(MalC/Cree)混合!strong>。这行不通。有关更多详细信息,请参阅或。

这里有几个问题。我回答“但是我如何从BinaryTree类内部判断它是由malloc还是new分配的?”


答案很简单<强>不要将C++ OLC(new /DELL)与C OLLC(MalC/Cree)混合!strong>。这行不通。有关更多详细信息,请参阅或。

在容器(如BinaryTree)中存储原始指针的唯一原因是,如果要引用在其他位置存储/管理的对象。在这种情况下,只需删除指针(而不是指针指向的对象)就足够了,因为对象的删除是在别处处理的


如果要管理树中动态分配的对象,请使用例如
std::unique_pointer
作为容器的元素类型。在这种情况下,再次简单地删除存储的元素就可以了,因为删除
std::unique_指针
意味着删除它指向的对象

在容器(如BinaryTree)中存储原始指针的唯一原因是,如果要引用在其他位置存储/管理的对象。在这种情况下,只需删除指针(而不是指针指向的对象)就足够了,因为对象的删除是在别处处理的


如果要管理树中动态分配的对象,请使用例如
std::unique_pointer
作为容器的元素类型。在这种情况下,再次简单地删除存储的元素就可以了,因为删除
std::unique_指针
意味着删除它指向的对象

>首先:在C++中避免<代码> MalOC 。然后,您不必担心是使用malloc还是new分配了某些内容,因为您从未使用malloc分配过任何内容。虽然您的问题还没有解决,但因为数组的
delete
delete[]
之间存在差异。。。所以你不能真的去删除别人的指示。我想一个好的咒语应该是“在我们信任的破坏者中”。)

第二:如果您试图创建一个容器类,如果您希望它参与资源管理,就不要将原始指针交给它。想想当你做一个
std::vector
时会发生什么。当这个向量运行它的析构函数时,它对包含的指针有什么作用吗?不。就它而言,它可能还持有整数。假设在其他地方进行寿命管理。(至少,我们希望……!)

如果您确实希望容器参与生命周期管理,则需要向它传递封装指针并使用某种协议的对象。虽然您可以自由定义任何喜欢的协议,但最容易使用的协议是已经标准化的协议。C++中的对象是否支持复制构造、移动构造、普通析构函数等。从标准的图书馆容器中寻找灵感是一个好的开始

请考虑你的容器将对象放入破坏队列中的想法,然后调用一个方法来销毁它们。成批销毁对象可能有好处,但为什么通用容器会关心这一点呢?为什么包含的对象不能正常运行其析构函数,而是让该析构函数将包装对象的内容放入某种“包含的对象管理器”维护的队列中?如果您真正需要的话,您可以将关注点从容器中完全分离出来。通常情况下,你并不需要它


如其他人所述,如果您还没有,请查阅 SyddYPPT/<代码>和<>代码> UnQuyGPPT/<代码>,并且您可以从

< P>的情况中学习到一些东西:首先在C++中避免<代码> MalOC 。然后,您不必担心是使用malloc还是new分配了某些内容,因为您从未使用malloc分配过任何内容。虽然您的问题还没有解决,但因为数组的
delete
delete[]
之间存在差异。。。所以你不能真的去删除别人的指示。我想一个好的咒语应该是“在我们信任的破坏者中”。)

第二:如果您试图创建一个容器类,如果您希望它参与资源管理,就不要将原始指针交给它。想想当你做一个
std::vector
时会发生什么。当这个向量运行它的析构函数时,它对包含的指针有什么作用吗?不。就它而言,它可能还持有整数