我写了一个名为“ TreeContainer ”的类。我的目标是设计一个树容器,将内容保持在树状层次结构中。每个树容器都应该像文件系统中的文件夹/目录一样工作。文件夹(树)可以具有子文件夹(子树)和其他文件(子项)。
我将其包含在另一个源文件中,说它的名称是“ TreeUser.cpp ”。当我尝试调试/运行项目时,Visual Studio逐一编译项目源文件,并且在IDE的“输出”面板中看到当前正在编译哪个文件。当涉及到 TreeUser.cpp 文件时,该文件花费了太多时间。最后,它给出下面的致命错误,并且编译停止。
错误C1060编译器的堆空间不足
[项目名称在这里]
[此处安装Visual Studio的路径] \ visual studio \ vc \ tools \ msvc \ 14.14.26428 \ include \ xmemory0 962
该类的代码如下。
TreeContainer.cpp
#pragma once
#include <vector>
template <class T>
class TreeContainer
{
public:
using SubTreeContainerType = std::vector<TreeContainer<T *> *>;
using SubItemContainerType = std::vector<T *>;
TreeContainer();
~TreeContainer();
// ... (Lots of member functions here. Removing or keeping them has no effect.)
private:
SubTreeContainerType SubTrees;
SubItemContainerType SubItems;
};
template <class T>
TreeContainer<T>::TreeContainer()
: SubTrees(), SubItems()
{
}
template <class T>
TreeContainer<T>::~TreeContainer()
{
for (typename SubTreeContainerType::iterator it=SubTrees.begin(); it!=SubTrees.end(); ++it)
{
//delete *it; (I get the error when I uncomment this line.)
}
for (typename SubItemContainerType::iterator it=SubItems.begin(); it!=SubItems.end(); ++it)
{
delete *it;
}
}
经过多次试验,我发现析构函数中的行引起了问题。删除它可以解决问题。但是我需要那条线来清理内存。
在那一行,我在容器delete
的内容上调用SubTrees
运算符。应该在每个子树上递归调用析构函数。我在这里做错什么了吗,或者这是Visual Studio中的错误。
IDE版本:Visual Studio Community 2017 15.7.4
命令行选项:
/ permissive- / GS / W3 / wd“ 4290” / wd“ 5040” / Zc:wchar_t / ZI / Gm- / Od / sdl /Fd"x64\Debug\vc141.pdb“ / Zc:inline / fp :精确/ D“ SC_DEBUG” / D“ _SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING” / D“ _UNICODE” / D“ UNICODE” / errorReport:prompt / WX- / Zc:forScope / RTC1 / Gd / MDd / std:c ++ 17 / FC / Fa “ x64 \ Debug \” / EHsc / nologo / Fo“ x64 \ Debug \” / Fp“ x64 \ Debug \ Project Name.pch” / diagnostics:classic
答案 0 :(得分:0)
似乎您从模板中创建了许多类,因为SubTreeContainerType
中的TreeContainer<T>
引用了TreeContainer<T *>
(T
指针的容器)。
析构函数需要子树向量的析构函数,而子树向量又需要TreeContainer<T *>
的析构函数,而后者需要TreeContainer<T **>
的析构函数,等等。pp。
解决方案:
using SubTreeContainerType = std::vector<TreeContainer<T> *>;
或者,如果您确实希望子树容器引用指向T
的指针,请为指针添加模板专用化,以在实现方法之前中断递归。