2017-10-21 12 views
0

私はstd::unique_ptrを初期化しようとするが、それはコンパイルに失敗します。deleterでunique_ptrコンストラクタを呼び出す方法は?

error: no matching function for call to ‘std::unique_ptr<int, void (*)(int*)>::unique_ptr(int*, void (&)(void*) throw())’ 

m_head((int*)malloc(m_capacity * sizeof(int)), std::free) { 
                 ^

この私のコード:

class deque { 
    const int INC_ARRAY = 2; 

    int m_front, m_back; 
    int m_capacity; 
    std::unique_ptr<int, void (*)(int *)> m_head; 

public: 
    const int EMPTY_DEQUE = -1; 

    /** 
    * @brief Constructor 
    */ 
    deque() 
     : m_front{INC_ARRAY - 1}, m_back{INC_ARRAY}, 
     m_capacity{2 * INC_ARRAY}, 
     m_head{(int*)malloc(m_capacity * sizeof(int)), std::free} { 
    } 
}; 

私はnewmallocを使用する必要はありません。正しく初期化するには?

P.S.私はC++だけを学んでいます

+1

使用しているCスタイルのキャストの代わりに、static_cast (malloc ...)を使用することをお勧めします。 'static_cast'はうまくいくと思いますが、' reinterpret_cast'が必要な場合があります。これらのキャストは、Cスタイルのキャストよりも、より具体的です(したがって、より安全です)。また、コード内で選択するのも簡単です。 – Omnifarious

+0

@Omnifarious、アドバイスありがとうございます! –

+0

"*' new'ではなく 'malloc'を使う必要があります*" - なぜですか? 'malloc'はCではなくC++です。 'new'はC++でメモリを割り当てる公式な方法です。そのためには、自動的に解放される動的配列を割り当てるだけです。 C++にはその目的のための 'std :: vector'クラスがあります。 –

答えて

6

std::freeの署名はvoid free(void*)です。 int*は受け付けていません。削除タイプを変更します。

std::unique_ptr<int, void(*)(void*)> m_head; 
+1

正しい署名を渡すより安全な方法は、代わりに '' decld :: unique_ptr m_head; ' –

+2

@RemyLebeau:' decltype(&std :: free) 'それ以外の場合は、そうです。 –

関連する問題