Я хочу лучше понять, как реализовать идиому RAII с моими классами, например: Какой рекомендуемый метод для обеспечения указателей является бесплатным()? Правильно в моем классе?RAII - Указатели и область видимости
У меня есть класс, который должен существовать в течение всего времени программы. В духе RAII и потому, что мне нужно передать ссылку на этот класс другим классам, я держу его в shared_ptr (не уверен, что он действительно должен храниться в shared_ptr, но для удовольствия он есть).
В классе ctor я использую 2 буфера (указатели), а затем цикл несколько раз malloc() 'ing, используя буфер, а затем free()' ing. 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.
Это странное сочетание идей C и C++ ... Есть ли причина, по которой вы используете malloc вместо новых или даже лучших STL-шаблонов? Они лучше подходят для концепции RAII. – tmpearce
@tmpearce: Это связано с моей неопытности и использованием MSDN в качестве учебного ресурса. Я ценю ссылки на альтернативы/улучшения. – Lokked