更改std :: unique_ptr中的指针而不破坏它

时间:2016-09-10 17:14:09

标签: c++ c++11 smart-pointers

我有C ++代码,它使用带有C函数mallocfreerealloc的原始指针。

我正在考虑将其更改为智能指针,但我确实希望保留realloc功能,因为我认为它比new好得多,因为它不需要&#34 ;移动"每次的内容。

我如何使用std::unique_ptr重构此内容?

这是一些伪代码(我意识到这段代码不是100%安全。实际上我从未尝试过编译它)

class Demo{
   char *ptr;
   Demo(size_t size) : ptr( malloc(size) ){}

   bool resize(size_t size){
      char *ptr_new = realloc(ptr, size);

      if (ptr_new == nullptr){
         return false; // fail
      }

      // here is tricky part with std::unique_ptr,
      // ptr is already deleted...
      ptr = ptr_new;

      return true;
   }
};

1 个答案:

答案 0 :(得分:8)

重新指定指针而不删除指针的方法是使用release()

auto old_ptr = unique.release();
unique.reset(new_ptr);

所以在您的代码中应该是这样的:

struct free_deleter {
    void operator(void* p) const { free(p); }
};

std::unique_ptr<char, free_deleter> ptr; // NB: malloc must be paired with free, not delete

bool resize(size_t size) {
    char* ptr_new = realloc(ptr.get(), size);
    if (!ptr_new) {
        return false;
    }

    ptr.release();
    ptr.reset(ptr_new); 
    return true;
}