소스 검색

2010-03-05 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>

	Fixed memory leak in SocketBuffer when _bufq is not empty when
	SocketBuffer is deleted. Added BufEntry constructor and deleted
	static factory functions.
	* src/SocketBuffer.cc
	* src/SocketBuffer.h
Tatsuhiro Tsujikawa 15 년 전
부모
커밋
f0938cf1d6
3개의 변경된 파일20개의 추가작업 그리고 18개의 파일을 삭제
  1. 8 0
      ChangeLog
  2. 8 3
      src/SocketBuffer.cc
  3. 4 15
      src/SocketBuffer.h

+ 8 - 0
ChangeLog

@@ -1,3 +1,11 @@
+2010-03-05  Tatsuhiro Tsujikawa  <t-tujikawa@users.sourceforge.net>
+
+	Fixed memory leak in SocketBuffer when _bufq is not empty when
+	SocketBuffer is deleted. Added BufEntry constructor and deleted
+	static factory functions.
+	* src/SocketBuffer.cc
+	* src/SocketBuffer.h
+
 2010-03-05  Tatsuhiro Tsujikawa  <t-tujikawa@users.sourceforge.net>
 
 	Only execute RequestGroupMan::fillRequestGroupFromReserver() when

+ 8 - 3
src/SocketBuffer.cc

@@ -35,6 +35,7 @@
 #include "SocketBuffer.h"
 
 #include <cassert>
+#include <algorithm>
 
 #include "SocketCore.h"
 #include "DlAbortEx.h"
@@ -46,16 +47,20 @@ namespace aria2 {
 SocketBuffer::SocketBuffer(const SharedHandle<SocketCore>& socket):
   _socket(socket), _offset(0) {}
 
-SocketBuffer::~SocketBuffer() {}
+SocketBuffer::~SocketBuffer()
+{
+  std::for_each(_bufq.begin(), _bufq.end(),
+                std::mem_fun_ref(&BufEntry::deleteBuf));
+}
 
 void SocketBuffer::pushBytes(unsigned char* bytes, size_t len)
 {
-  _bufq.push_back(BufEntry::createBytes(bytes, len));
+  _bufq.push_back(BufEntry(bytes, len));
 }
 
 void SocketBuffer::pushStr(const std::string& data)
 {
-  _bufq.push_back(BufEntry::createStr(data));
+  _bufq.push_back(BufEntry(data));
 }
 
 ssize_t SocketBuffer::send()

+ 4 - 15
src/SocketBuffer.h

@@ -67,22 +67,11 @@ private:
       }
     }
       
-    static BufEntry createBytes(unsigned char* bytes, size_t len)
-    {
-      BufEntry b;
-      b.type = TYPE_BYTES;
-      b.bytes = bytes;
-      b.bytesLen = len;
-      return b;
-    }
+    BufEntry(unsigned char* bytes, size_t len):
+      type(TYPE_BYTES), bytes(bytes), bytesLen(len) {}
 
-    static BufEntry createStr(const std::string& str)
-    {
-      BufEntry b;
-      b.type = TYPE_STR;
-      b.str = new std::string(str);
-      return b;
-    }
+    BufEntry(const std::string& str):
+      type(TYPE_STR), str(new std::string(str)) {}
   };
     
   SharedHandle<SocketCore> _socket;