2016-06-10 2 views
0

Возможно ли иметь конструктор копирования, если класс имеет указатель адреса mmap? Я думаю, что mmap был вызван только один раз, и поэтому в ядре была зарегистрирована только одна ссылка. Теперь два объекта обмениваются этим адресом, когда 1 удаляется, что происходит с этим адресом? Наверное, это очищено. Если возможно, будет ли файл mmap обрабатывать синхронизацию для меня?Копировать конструктор с адресом mmap

+1

Почему негативы? Дайте некоторую обратную связь. – user1876942

+0

Я думаю, отрицательный, потому что недостаточно информации для тех, кто может ответить на ваш вопрос. –

+0

Это общий вопрос. Можете ли вы поместить указатель mmap в конструктор копирования? Какая информация вам нужна? – user1876942

ответ

2

shared_ptr ваш друг здесь:

#include <sys/mman.h> 
#include <memory> 


std::shared_ptr<void> map_some_memory(void *addr, size_t length, 
             int prot, int flags, 
             int fd, off_t offset) 
{ 
    auto deleter = [length](void* p) { 
    munmap(p, length); 
    }; 

    // use of a custom deleter ensures that the mmap call is undone 
    // when the last reference to the memory goes away. 

    return { mmap(addr, length, prot, flags, fd, offset), deleter }; 

} 

// some function that gets you a file descriptor 
extern int alloc_fd(); 

int main() 
{ 
    int some_file = alloc_fd(); 

    // allocate a shared mapping 
    auto my_mapped_ptr = map_some_memory(nullptr, 100, PROT_READ | PROT_WRITE, 
             MAP_SHARED, some_file, 0); 

    // cast it to sometthing else 

    auto shared_ints = std::shared_ptr<int>(my_mapped_ptr, 
              reinterpret_cast<int*>(my_mapped_ptr.get())); 

    // another shared pointer pointing to the shared ints 
    auto another_share = shared_ints; 

} 
+0

Спасибо, я посмотрю на это. Я также думаю о том, чтобы сделать мой класс несовместимым. – user1876942

+0

@ user1876942 В этом случае 'unique_ptr' с пользовательским типом удаления является вашим другом –

Смежные вопросы