2017-04-20 2 views
-1

Bei der Verwendung von cppcheck auf meinem Code zeigte es an, dass eine Funktion const gemacht werden könnte. Cppcheck scheint korrekt zu sein, aber ich fand das memcpy im Code seltsam.Mempy und const Korrektheit

Auszug aus dem Code:

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

Zu meinem Verständnis wird die Memcpy indirekt schreiben _buffer so ist die Funktion nicht konst. Aber selbst wenn _buffer direkt verwendet wird, kompiliert der Compiler den Code immer noch ohne einen Fehler.

Warum erzeugt der Compiler hier keinen Fehler?

+3

Schwer zu sagen, ob Sie die Funktion Signatur nicht veröffentlichen und wo cppcheck möchte, dass du die 'const' platzierst. Bitte erstellen Sie ein [MCVE]. –

+6

Es ändert Dinge, die auf '_buffer', nicht' _buffer' selbst hinweisen; dann könnte es "const" -Funktion sein. – songyuanyao

+2

Sie verwenden einen C-Style-Cast, was im Grunde bedeutet, dass Sie besser wissen als Ihr Compiler und es muss den Mund halten und tun, was Sie ihm sagen. Wenn Sie möchten, dass Ihre Tools Ihren Code für Sie überprüfen, sollten Sie keine C-Style-Casts verwenden. –

Antwort

1

Es gibt zwei verschiedene Orte, an denen const mit Zeigern verwendet werden kann.

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

macht Ihr Objekt const macht seinen Zeigertyp Mitglieder const im zweiten Sinne, nie im ersten Sinne. Das aktuelle Objekt (*this) ist const in einer const Elementfunktion.

Wenn Sie die Spitz auf Daten benötigen werden const auch Sie Ihre Zeiger in einer benutzerdefinierten Klasse wickeln können, die tief Ausbreitung von Konstantheit tut:

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; 
};