首页 > 解决方案 > 跟踪递归生成的指针

问题描述

我有一种情况,不清楚何时应该丢弃指针。这是由于使用递归的类基于输入调用了不同的方法。下面我重新创建了这种情况的一个非常粗略的例子。在我编写的代码中,而不是Data*作为递归的返回,我使用了typedef boost::variant混合了指针和标准类型的 a,这使得跟踪哪些是需要释放的指针变得更加困难。


struct Data {
    int a = 2;
    Data(int ca) {
        a = ca;
    }

};


class MemoryLeakCentral {
public:

      MemoryLeakCentral(int a) {
           doStuff(a);
      }

      ~MemoryLeakCentral() {
           /*    delete all pointers  */
       }

      Data* createPointer(int a) {
          Data* data = new Data(a);
          return data;
      }   

private:
    Data* doStuff(int a) {
         Data* data = createPointer(5);
         /*
             do stuff with "data"
             e.g. 

             if(data->a == ...) {
                data->a = ...
                return doMoreStuff(data)
             }
             else if(...)
             else if(...) etc
         */
         return data;
     }


     Data* doMoreStuff(Data* data) {
         /*
             do stuff with "data"

             if(data->a == ...) {
                data->a = ...
                return doMoreStuff(data)
             }
             else if(...)
             else if(...) etc
         */
         return data;
     }

    ...
    //more Data* returning functions

};

在上面的代码中,我试图营造一种递归是深刻而复杂的感觉。

我的问题是:让类MemoryLeakCentral删除它在遇到析构函数后生成的所有指针的最佳方法是什么。我的一个想法是将创建的所有指针存储createPointer在一个向量中,然后一旦~MemoryLeakCentral调用,循环遍历该向量并删除所有指针。

那么有没有更好的解决方案呢?我知道创建指针的位置,但由于发生复杂的递归,无法轻易确定它在哪里被销毁。

标签: c++pointersrecursionmemorymemory-leaks

解决方案


推荐阅读