Я хочу лучше понять, как реализовать идиому RAII с моими классами, на примере: каков рекомендуемый метод для обеспечения правильности указателей free () в моем классе?
У меня есть класс, который должен существовать на протяжении всей программы. В духе RAII и потому, что мне нужно передать ссылку на этот класс другим классам, я держу его в shared_ptr (не уверен, что его действительно нужно хранить в shared_ptr, но для интереса, это так).
В классе ctor я использую 2 буфера (указателя) и затем многократно повторяю цикл malloc (), используя буфер и затем освобождая (). Dtor должен содержать отказоустойчивый код для освобождения буферов в случае сбоя.
Единственный способ, которым dtor может видеть буферы, - это если я объявляю их как переменные класса, однако они используются только в классе ctor.
Пример:
class Input
{
private:
PSOMETYPE buffer1;
public:
Input();
~Input();
}
Input::Input() : buffer1(NULL)
{
for(blahblah)
{
buffer1 = (PSOMETYPE)malloc(sizeof(SOMETYPE));
// Do work w/buffer1
if(buffer1 != NULL) { free(buffer1); buffer1 = NULL }
}
}
Input::~Input()
{
if(buffer1 != NULL) { free(buffer1); buffer1 = NULL }
}
Учитывая, что я использую только буфер в ctor, имеет ли смысл объявлять его как переменную частного класса? Если я объявлю это в рамках ctor, dtor не будет знать, что это такое.
Я знаю, что это тривиальный пример, и, честно говоря, я мог бы реализовать это так же легко, как забыть об использовании умного указателя для ссылки на мой класс и иметь пустой dtor, просто free (), как я делаю внутри цикла. У меня нет наставника или учебы, и я не уверен, когда следует придерживаться идиомы RAII.