Я унаследовал многопоточный унаследованный код, который, по-моему, неправильно уничтожает объект.
class A
{
private:
TCCState *b; // TCCState is struct from third party library
public:
static A func1();
~A();
};
std::unique_ptr<A> A::func1()
{
std::unique_ptr<A> res(new A());
int ret = gen_tcc_context(res); // gen_tcc_context is library function
return res; // this res is used as std::unique_ptr<A> temp(std::move(A::func1())); and then properly destroyed
}
A::~A()
{
if (b != nullptr){// Is this necessary? If yes, should I used a lock_guard for this code?
tcc_delete(b);// tcc_delete is a library function. This raises an exception - Assertion failed: ("Invalid file descriptor. File possibly closed by a different thread",0)
}
}
Похоже, фрагмент кода в деструкторе пытается закрыть то, что уже закрыто. Действительно ли необходим фрагмент кода в деструкторе? Если да, безопасно ли использовать lock-guard?