浏览代码

Use weak_ptr for TypeDescriptor cross-links. Fixed total TypeDescriptor memory leak.

AlexVinS 9 年之前
父节点
当前提交
a50a32405d
共有 2 个文件被更改,包括 5 次插入2 次删除
  1. 3 1
      lib/Connection.cpp
  2. 2 1
      lib/Connection.h

+ 3 - 1
lib/Connection.cpp

@@ -474,8 +474,10 @@ std::vector<CTypeList::TypeInfoPtr> CTypeList::castSequence(TypeInfoPtr from, Ty
 		{
 			auto typeNode = q.front();
 			q.pop();
-			for(auto &nodeBase : upcast ? typeNode->parents : typeNode->children)
+
+			for(auto & weakNode : (upcast ? typeNode->parents : typeNode->children) )
 			{
+				auto nodeBase = weakNode.lock();
 				if(!previous.count(nodeBase))
 				{
 					previous[nodeBase] = typeNode;

+ 2 - 1
lib/Connection.h

@@ -156,11 +156,12 @@ class DLL_LINKAGE CTypeList: public boost::noncopyable
 public:
 	struct TypeDescriptor;
 	typedef std::shared_ptr<TypeDescriptor> TypeInfoPtr;
+	typedef std::weak_ptr<TypeDescriptor> WeakTypeInfoPtr;
 	struct TypeDescriptor
 	{
 		ui16 typeID;
 		const char *name;
-		std::vector<TypeInfoPtr> children, parents;
+		std::vector<WeakTypeInfoPtr> children, parents;
 	};
 	typedef boost::shared_mutex TMutex;
 	typedef boost::unique_lock<TMutex> TUniqueLock;