如何在现代C ++中管理连续的内存块?

时间:2018-10-20 05:26:20

标签: c++ memory-management

这些天我一直在做一些低级的C ++编程,它涉及很多内存管理问题。例如,我可能需要维护一块连续的内存:

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 ++中连续内存块管理的最佳实践是什么?我应该使用std :: unique_ptr还是std :: allocator之类的东西?

1 个答案:

答案 0 :(得分:2)

  

很多书都说我们应该避免在现代C ++中使用任何原始指针

应避免仅拥有原始指针。在您的情况下,您需要std::free()指针,以便您拥有。因此,您绝对应该将其放在std::unique_ptr中,但要使用自定义删除器来调用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.