From d1301b8697f6d2a1c0c547c504317495406ab0f7 Mon Sep 17 00:00:00 2001
From: Nils Maier <maierman@web.de>
Date: Tue, 26 Feb 2013 10:40:51 +0100
Subject: [PATCH] Do not reference RequestGroups longer than necessary

There is an initial vector of SharedHandle<RequestGroup> to seed the
DownloadEngine. This vector was however kept alive via main.cc ->
MultiUrlRequestInfo up until the program exits, hence effetively leaking
all initial RequestGroups and associated object instances.

Hence, as a matter of dirty-workaround, drop the contents of that initial
vector as soon as it is not required any longer.
---
 src/MultiUrlRequestInfo.cc | 4 +++-
 src/MultiUrlRequestInfo.h  | 8 ++++++--
 2 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/src/MultiUrlRequestInfo.cc b/src/MultiUrlRequestInfo.cc
index 0d8a224a..389e40ca 100644
--- a/src/MultiUrlRequestInfo.cc
+++ b/src/MultiUrlRequestInfo.cc
@@ -104,7 +104,7 @@ void handler(int signal) {
 } // namespace
 
 MultiUrlRequestInfo::MultiUrlRequestInfo
-(const std::vector<SharedHandle<RequestGroup> >& requestGroups,
+(std::vector<SharedHandle<RequestGroup> >& requestGroups,
  const SharedHandle<Option>& op,
  const SharedHandle<StatCalc>& statCalc,
  const SharedHandle<OutputFile>& summaryOut,
@@ -158,6 +158,8 @@ error_code::Value MultiUrlRequestInfo::execute()
 
     SharedHandle<DownloadEngine> e =
       DownloadEngineFactory().newDownloadEngine(option_.get(), requestGroups_);
+    // Avoid keeping RequestGroups alive longer than necessary
+    requestGroups_.clear();
 
     if(!option_->blank(PREF_LOAD_COOKIES)) {
       File cookieFile(option_->get(PREF_LOAD_COOKIES));
diff --git a/src/MultiUrlRequestInfo.h b/src/MultiUrlRequestInfo.h
index cdc84bc4..45a627df 100644
--- a/src/MultiUrlRequestInfo.h
+++ b/src/MultiUrlRequestInfo.h
@@ -52,7 +52,7 @@ class UriListParser;
 
 class MultiUrlRequestInfo {
 private:
-  std::vector<SharedHandle<RequestGroup> > requestGroups_;
+  std::vector<SharedHandle<RequestGroup> >& requestGroups_;
 
   SharedHandle<Option> option_;
 
@@ -64,8 +64,12 @@ private:
 
   void printMessageForContinue();
 public:
+  /*
+   * MultiRequestInfo effectively takes ownership of the
+   * requestGroups.
+   */
   MultiUrlRequestInfo
-  (const std::vector<SharedHandle<RequestGroup> >& requestGroups,
+  (std::vector<SharedHandle<RequestGroup> >& requestGroups,
    const SharedHandle<Option>& op,
    const SharedHandle<StatCalc>& statCalc,
    const SharedHandle<OutputFile>& summaryOut,