LINUX.ORG.RU

История изменений

Исправление X512, (текущая версия) :

проблема возникает, когда объект непростой, логика его создания непростая.

Пример на C++:

#include <stdio.h>
#include <memory>

class Object
{
public:
	int fId;
	Object(int id): fId(id) {printf("+Object(%d)\n", fId); if (fId == 2) throw this;}
	~Object() {printf("-Object(%d)\n", fId);}
};

class CompObject
{
public:
	std::unique_ptr<Object> fObj1, fObj2, fObj3;
	
	CompObject()
	{
		printf("+CompObject\n");
		fObj1.reset(new Object(1));
		fObj2.reset(new Object(2));
		fObj3.reset(new Object(3));
	}
	
	~CompObject()
	{
		printf("-CompObject\n");
	}
};

int main()
{
	try {
		CompObject co;
	} catch(...) {
		printf("catch\n");
	}
	return 0;
}

Результат:

+CompObject
+Object(1)
+Object(2)
-Object(1)
catch

Исходная версия X512, :

проблема возникает, когда объект непростой, логика его создания непростая.

Пример на C++:

#include <stdio.h>
#include <memory>

class Object
{
public:
	int fId;
	Object(int id): fId(id) {printf("+Object(%d)\n", fId); if (fId == 2) throw this;}
	~Object() {printf("-Object(%d)\n", fId);}
};

class CompObject
{
public:
	std::unique_ptr<Object> fObj1, fObj2, fObj3;
	
	CompObject()
	{
		printf("+CompObject\n");
		fObj1.reset(new Object(1));
		fObj2.reset(new Object(2));
		fObj3.reset(new Object(3));
	}
	
	~CompObject()
	{
		printf("-CompObject\n");
	}
};

int main()
{
	try {
		CompObject co;
	} catch(...) {
		printf("catch\n");
	}
	return 0;
}

Результат:

+CompObject
+Object(1)
+Object(2)
-Object(1)
catch