Я собираю класс, я собираюсь вызвать файл.
Файловый объект просто содержит указатель на отображенный в памяти файл и ссылку.
Конструктор берет файл и отображает файл в диапазон памяти. В итоге это выглядит
примерно так:
class file
{
public:
file(unsigned char* filename) { open(filename); }
open(unsigned char* filename)
{
/// snip
length_ = fstat(.....)
file_ = mmap(.....)
}
private:
unsigned int length_;
unsigned char* bytes_;
};
Теперь этот файловый объект можно скопировать.
А вот и веселье. Обычно такой класс требует конструктора глубокого копирования для копирования bytes_. Тем не менее, я удовлетворен тем, что могу просто скопировать указатель, поскольку память используется совместно, и в любом случае он должен смотреть на один и тот же файл. Я не хочу
переназначить файл. Но, очевидно, чтобы предотвратить утечку памяти bytes_ в какой-то момент будет
должен быть освобожден.
Какие механизмы я могу использовать, чтобы решить, когда удалять память и munmap?
Я думал об использовании boost :: shared_ptr для освобождения памяти в деструкторе только тогда, когда это последняя ссылка, но я должен был бы защитить это с помощью блокировки мьютекса, верно?
Есть ли какие-нибудь удобные функции повышения, которые я могу использовать? Я не хочу тянуть в другую большую библиотеку, это не вариант.
т.е.
boost::shared_ptr<unsigned char> bytes_;
~file()
{
// enter some sort of critical section
if (bytes_.unique()){
munmap(bytes_);
bytes_ = 0;
}
// exit critical section
}