Как управлять непрерывными блоками памяти в современном C ++?

голоса
-2

Я делал некоторые низкий уровень C ++ программирования в эти дни, и это involes много вопроса управления памятью. Например, я, возможно, потребуется, чтобы сохранить кусок непрерывной памяти:

char* ptr = static_cast<char*>(malloc(sizeof(char)*512*1024));
....
do_something(ptr); // pass to other functions
....
do_something(ptr+sizeof(int)*4); // random access may be needed
....
free(ptr);

Тем не менее, многие книги говорят, что мы должны избегать использования какого-либо сырого указателя в современных C ++ программирования и смарт-указатели являются предпочтительным. Таким образом, что лучшая практика для непрерывного управления чанкой памяти в современном C ++? Должен ли я использовать что-то вроде станд :: unique_ptr или станд :: распределителем?

Задан 20/10/2018 в 05:26
источник пользователем
На других языках...                            


1 ответов

голоса
2

« Многие книги говорят , что мы должны избегать использования какого - либо сырого указателя в современных C ++ »

Это только владеющие сырые указатели , которые следует избегать. В вашем случае вам нужно std::free()указатель , так что вы владеете его. Поэтому вы должны обязательно поставить его в std::unique_ptrно обычай Deleter позвонить std::free().

// some type aliases to make life shorter...
struct malloc_deleter{void operator()(void* vp) const { std::free(vp); }};
using  malloc_uptr = std::unique_ptr<char, malloc_deleter>;

auto ptr = malloc_uptr(static_cast<char*>(std::malloc(sizeof(char)*512*1024)));
....
do_something(ptr.get()); // pass to other functions
....
do_something(ptr.get()+sizeof(int)*4); // random access may be needed
....
// no need to free, gets done when ptr` goes out of scope.
Ответил 20/10/2018 в 05:38
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more