2017-04-20 8 views
-1

私のコードにcppcheckを使用すると、関数をconstにすることができたことが示されました。 Cppcheckは正しいと思われますが、私はコード内でmemcpyが奇妙であることを発見しました。コードからMemcpyとconstの正確さ

抜粋:

if ((offset + size) <= _bufferSize) 
     { 
      char* _destPtr = (char*)_buffer + offset; 
      memcpy(_destPtr, data, size); 
      result = true; 
     } 

私の理解へのmemcpyは、間接的にその機能がconstのではない_bufferして書き込みます。しかし、_bufferを直接使用しても、コンパイラはエラーなしでコードをコンパイルします。

ここでエラーが発生しないのはなぜですか?

+3

ハードcppcheckはあなたが 'const'を置くことを望みます。 [MCVE]を作成してください。 –

+6

これは、 '_buffer'自身ではなく、' _buffer'で指摘されているものを修正しています。それは 'const'関数である可能性があります。 – songyuanyao

+2

あなたはCスタイルのキャストを使用しています。これは、基本的にコンパイラよりも優れていることを意味し、シャットダウンして、あなたがそれを伝えていることを意味します。あなたのツールがあなたのコードをタイプチェックするのを望むなら、Cスタイルのキャストを使わないことを検討してください。 –

答えて

1

constにポインタを使用できる場所は2つあります。あなたのオブジェクトconstを作る

const char * x; // (1) data pointed by x is const 
char * const x; // (2) x itself is const 

は、第2のセンスで、決して最初の意味でconstそのポインタ型のメンバーになります。現在のオブジェクト(*this)は、constメンバ関数ではconstです。

あなたは尖った-にデータがあまりにもconstになる必要がある場合は、const性の深い伝播を行うカスタムクラスであなたのポインタをラップすることができます:あなたは関数のシグネチャを投稿していない場合は教えて

template <class T> class deep_const_ptr { 
    // .... ctors, operator*, the usual stuff 
    T* get() { return data; } 
    const T* get() const { return data; } 
    private: 
    T* data; 
}; 
関連する問題