raii отлично работает при распределении от Global Ressource / OS. Почти все случаи в стандартной библиотеке используют некоторые глобальные ресурсы, но предположим, что это не так. (Исключением, конечно, является пользовательским распределителем для контейнеров, но это не очень хороший пример в моем представлении о коде, который вы хотите в производстве (в основном просто используют указатели повсюду). < /P>
Код: Выделить всё
// obj_rep could for example contain an id number or handle/pointer of some kind, does not //matter so much
struct Manager() {
obj_rep allocate();
void deallocate(obj_rep);
}
struct MyObject {
MyObject (Manager& m) : mng {m} {
//call allocate with a manager object
rep = mng.allocate();
}
~MyObject () {
//call deallocate with the same manager object
mng.deallocate(rep);
}
//TODO: implement rule of 3/5 here
private:
obj_rep rep;
Manager& mng;
}
В приведенном выше примере (и в моей текущей реализации) я сохранил ссылку (также может быть указателем) для менеджера - это требует, чтобы пользователь правильно управлял временем срока службы. Но есть ли лучший способ? Я знаю, что можно использовать shared_ptr /sleed_ptr , но есть ли способ как -то обратить вспять дизайн, чтобы избавиться от проблемы срока службы и все еще иметь инкапсуляцию Raii?
Подробнее здесь:
https://stackoverflow.com/questions/794 ... manager-is