ソースを参照

Fix leaked ObjectRCs on object Variant reassignment

Bonus:
- Add some (un)likely magic
- Use memdelete() instead of memfree() (not strictly needed, but more correct)
Pedro J. Estébanez 5 年 前
コミット
dca653cc3a
2 ファイル変更12 行追加5 行削除
  1. 1 1
      core/object.cpp
  2. 11 4
      core/variant.cpp

+ 1 - 1
core/object.cpp

@@ -1996,7 +1996,7 @@ Object::~Object() {
 	ObjectRC *rc = _rc.load(std::memory_order_acquire);
 	if (rc) {
 		if (rc->invalidate()) {
-			memfree(rc);
+			memdelete(rc);
 		}
 	}
 #endif

+ 11 - 4
core/variant.cpp

@@ -1121,9 +1121,9 @@ void Variant::clear() {
 		case OBJECT: {
 
 #ifdef DEBUG_ENABLED
-			if (_get_obj().rc) {
-				if (_get_obj().rc->decrement()) {
-					memfree(_get_obj().rc);
+			if (likely(_get_obj().rc)) {
+				if (unlikely(_get_obj().rc->decrement())) {
+					memdelete(_get_obj().rc);
 				}
 			} else {
 				_get_obj().ref.unref();
@@ -2655,9 +2655,16 @@ void Variant::operator=(const Variant &p_variant) {
 		} break;
 		case OBJECT: {
 
+#ifdef DEBUG_ENABLED
+			if (likely(_get_obj().rc)) {
+				if (unlikely(_get_obj().rc->decrement())) {
+					memdelete(_get_obj().rc);
+				}
+			}
+#endif
 			*reinterpret_cast<ObjData *>(_data._mem) = p_variant._get_obj();
 #ifdef DEBUG_ENABLED
-			if (_get_obj().rc) {
+			if (likely(_get_obj().rc)) {
 				_get_obj().rc->increment();
 			}
 #endif