在析构函数中调用`delete`运算符时,编译器错误“编译器空间不足”

时间:2018-06-29 14:40:46

标签: c++ visual-studio compiler-errors delete-operator

我写了一个名为“ 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

1 个答案:

答案 0 :(得分:0)

似乎您从模板中创建了许多类,因为SubTreeContainerType中的TreeContainer<T>引用了TreeContainer<T *>T指针的容器)。

析构函数需要子树向量的析构函数,而子树向量又需要TreeContainer<T *>的析构函数,而后者需要TreeContainer<T **>的析构函数,等等。pp。

解决方案:

using SubTreeContainerType = std::vector<TreeContainer<T> *>;

或者,如果您确实希望子树容器引用指向T的指针,请为指针添加模板专用化,以在实现方法之前中断递归。