Sehen Sie sich die %code% struct:
an
%Vor%
Aufgrund der Ausrichtung der Datenstruktur kann die Adresse von %code% gezwungen sein, sich an die Adresse eines Vielfachen der Wortgröße anzupassen. Daher werden mehrere nicht verwendete Bytes zwischen %code% und %code% aufgefüllt. Das sind die Bytes, die nicht initialisiert und somit von Valgrind gemeldet wurden.
Um das Problem zu umgehen, könnten Sie das Initialisieren der gesamten Struktur durch %code% erzwingen.
%Vor%
___ tag123c ___ C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entworfen und behält eine ähnliche Syntax, ist aber jetzt eine komplett andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll.
___ answer19365569 ___
Obwohl @timrau ziemlich genau beschrieben hat, was das Kernproblem hier ist (Ausrichtung / Packen), bin ich kein Fan der vorgeschlagenen Lösung.
Sie haben eine %code% in Ihrem Code als %code% und %code% beschrieben. Die Größe der tatsächlichen Datenstruktur im Speicher ist jedoch nicht %code% , und das ist das Kernproblem.
Die vorgeschlagene Lösung schlägt vor, einfach alle Bits der %code% -Struktur zu löschen, bevor die wichtigen Bits eingefügt werden. Das Problem, das ich damit habe, ist sowohl ein semantischer als auch ein technischer - die Größe der Datenstruktur, die über den Draht gesendet wird, ist keine genaue Darstellung dessen, was Sie im Code modelliert haben. Mit anderen Worten, Sie senden nicht nur eine %code% und eine %code% - Sie senden eine %code% , eine %code% und einige andere cruft (padding).
Mein Vorschlag ist es, den Crust loszuwerden und nur das zu senden, was Sie in Ihrem Code modelliert haben.
Es gibt keine direkte Unterstützung in C ++, um Ausrichtung und Auffüllung auszuschalten, aber alle mir bekannten Compiler bieten einen einfachen Mechanismus, um Datenstrukturen auf %code% bytes auszurichten:
%Vor%
Dadurch wird die %code% -Datenstruktur genau , was Sie in Ihrem Code modelliert haben, ohne Auffüllung. Dadurch wird %code% unnötiger Zugriff und Sie senden genau %code% byte über die Verbindung.
___ tag123sockets ___ Ein Endpunkt eines bidirektionalen Interprozess-Kommunikationsflusses. Dies bezieht sich oft auf einen Prozessablauf über eine Netzwerkverbindung, ist jedoch keineswegs darauf beschränkt. Nicht zu verwechseln mit Websocket (einem Protokoll) oder anderen Abstraktionen (z. B. socket.io).
___ tag123valgrind ___ valgrind ist ein dynamisches Analysetool für Linux-, OS X-, Android- und Solaris-Systeme. Es kann zum Profilieren sowie zum Auffinden von Speicherlecks, Race-Conditions und Threading-Fehlern verwendet werden.
___ tag123memoryalignment ___ Speicherausrichtung bedeutet, dass sich Objekte und Variablen an bestimmten Offsets im Systemspeicher befinden.
___ qstntxt ___
Ich habe Valgrind verwendet, um nach Speicherlecks in meinem Code zu suchen. Obwohl keine Speicherlecks gefunden werden, werden einige Fehler gemeldet, die alle auf einer einzigen Funktion / Klassenmethode beruhen:
%Vor%
Das %code% , auf das die Fehler zeigen, ist Teil von %code% class:
%Vor%
Ich sehe nicht, was das Problem ist. Wo genau sind die nicht initialisierten Werte? Oder sollte ich einfach die von Valgrind gemeldeten Fehler ignorieren?
___