Отслеживание указателей, созданных в рекурсии - PullRequest
0 голосов
/ 05 мая 2020

У меня ситуация, когда неясно, когда следует отбрасывать указатель. Это связано с тем, что класс использует рекурсию с разными методами, вызываемыми на основе ввода. Ниже я воспроизвел очень грубый пример этой ситуации. В моем коде, который я пишу вместо Data* в качестве возврата для рекурсии, я использовал typedef boost::variant, который имеет сочетание указателей и стандартных типов, что еще больше усложняет отслеживание того, какие указатели должны быть


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, l oop через вектор и удалить все указатели.

Есть ли что-нибудь лучше решения тогда это? Я знаю точку, в которой создается указатель, но не могу легко определить, где он был уничтожен, из-за имеющейся сложной рекурсии.

...