2016-09-10 11 views
2

C関数のローポインタを使用するC++コードmalloc,freeおよびreallocがあります。ポインタをstd :: unique_ptrに変更せずに変更します

私はそれをスマートポインタに変更しようと考えていますが、よりもはるかに良いと信じているので、reallocの機能を維持したいと思います。毎回内容を移動する必要がないためです。

std::unique_ptrでこれをどのようにリファクタリングすることができますか? :ここでは

は、それを削除せずにポインタを再割り当てする方法はrelease()を使用することですいくつかの擬似コード(。私はこのコードは100%安全ではありません実現実際には、私はそれをコンパイルしようとしたことはありません)

​​
+3

あなたが本当に*か*必要'realloc'? IMO a 'std :: vector'または同様の動的コンテナはsoooよりはるかに優れています。 – Rakete1111

+2

私はそれを疑っています。「毎回内容を「移動」する必要がないので、新しいものよりもはるかに優れていると私は信じています。 –

+0

はい、私はベクトルが良いことを知っています。これはstd :: unique_ptrで行うことができるのだろうか? – Nick

答えて

8

です

ようなものになるだろう、あなたのコード内ので
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; 
} 
関連する問題