Operatorenüberladung
-
naja dort wird eben nur für einen long Speicher reserviert, ist doch ganz normal:
ausführlich
unsigned long bytes* = NULL;
bytes = new unsigned long [1];
-
Original erstellt von Parapiler:
also mal ganz konkret: in einem Programm von mir wird eine Exception ausgelöst und niemand findet einen Fehlerwelche exception?
-
beim zweiten cout und dem letzten memcpy wird eine Access violation ausgelöst (letzte und drittletzte zeile) und suche nun nach Hinweisen. Allerdings finde ich keine. Der Speicher ist reserviert, die pointer sind gültig.... ich habe da keine ahnung mehr.... ich dachte eventuell könnte man so ein Abbild von Speicher usw. bekommen und so auf einen Hinweis stoßen, schrittweises durchgehen des Codes ist ja gescheitert (nicht nur bei mir sondern auch bei anderen die ich mal nachgucken haben lasse, niemand hat was gefunden).
Eventuell etwas zur Vorgeschichte:
Der Code empfängt einen Buffer von einem Socket. Über das Socket wird eine in einem Buffer serialisierte (mit memcpy hintereinanderkopierte) Struktur. Diese Struktur soll nun wieder entfriemelt werden.
-
Original erstellt von Parapiler:
beim zweiten cout und dem letzten memcpy wird eine Access violation ausgelöstfalls du zufällig den msvc benutzt, starte im debug-modus mit f5 und du wirst in den debugger geworfen und dann drück alt+f7 für das fenster mit den bisherigen funktionsaufrufen und schau, ob in den variablen immer das richtige drinsteht und so fängte die ursache einer schutzverletzung normalerweise in wenigen minuten.
mehr kann ich leider nicht helfen.
-
ja das mache ich schon seit wochen....gibt es kein besseres konzept? Das nützt nämlich alles nicht ich kann damit nix weiter anfangen
-
Original erstellt von Parapiler:
ja das mache ich schon seit wochen....gibt es kein besseres konzept? Das nützt nämlich alles nicht ich kann damit nix weiter anfangenwenns keiner geheimhaltung unterliegt, kann ichs probieren.
-
ne du kannst die Projektdateien gerne haben. Rede mich einfach an, dann schicke ich sie dir....
AIM: PaRaDoXoNtWeNtY
ICQ: 157413201
Yahoo: Parapiler
-
-
richtig ist
memcpy (userinformation[counter].nickname, recbyte + sizeof (int) + sizeof (bool), bytecounter- sizeof(bool)-sizeof (int));
willst ja dem memcpy den wert von userinformation[counter].nickname geben, also die adresse den gerade neu angelegten speichers.
fasch ist
memcpy (&userinformation[counter].nickname, recbyte + sizeof (int) + sizeof (bool), bytecounter- sizeof(bool)-sizeof (int));
denn du willst den usernamen nicht nehmen und da reinschreiben, wo sich eigentlich die adresse des neuen speichers gemerkt werden soll.
-
Original erstellt von Parapiler:
schrittweises durchgehen des Codes ist ja gescheitert (nicht nur bei mir sondern auch bei anderen die ich mal nachgucken haben lasse, niemand hat was gefunden).durchgehen und sich die variableninhalte angucken.
also hier recbyte. ins watchfenster hab ich mir gelegt
recbyte[0]
recbyte[1]
recbyte[2]
recbyte[3]
recbyte[4]
recbyte[5]
recbyte[6]
und siehe da, in 5 und 6 waren die ersten buchstaben des namens. und dann war ja eigentlich schon die zeile mit dem memcpy als bösewicht identifiziert. nach dem memcpy war nämlich an ziel nix gescheites drin, aer in der quelle stehen ordentliche daten.
und dann hilt nur noch so lange draufstarren, bis man sich frage, ob das & dort absicht ist.
-
danke das war der Fehler wirklich tausend dankeschön! Ich habe das bei dem darauffolgenden memcpy auch korrigiert, und das funktioniert nun.
Jedoch, auch wenn das jetzt leicht der falsche Thread ist, aber beim ersten memcpy:
//erstes Byte (BOOLEAN) des Empfangsbuffers in registry kopieren memcpy (&userinformation[counter].registry, recbyte + sizeof (int) , sizeof (bool));
gibt der mir einen fehler, wenn ich als ersten Parameter die Adresse nicht mehr angebe. Das wird ja auch richtig ausgewertet, aber ich verstehe jetzt nicht mehr warum.
-
hab deinen code schon gelöscht.
aber ist .registry vielleicht ein char-array? dann wär die adresse des ersten elements in der tat &userinformation[counter].registry. und wenns ein char-zeiger wäe, der wo anders hinzeigt, dann wäre die andresse des ersten elements der woandersdaten userinformation[counter].registry.
-
nein ist nen bool aber das andere war nen char-array..... dann ist es eben genau andersrum als du gesagt hast, danke.
-
Original erstellt von Parapiler:
nein ist nen bool aber das andere war nen char-array..... dann ist es eben genau andersrum als du gesagt hast, danke.éin char-array wäre wie ein bool. aber ein char-pointer wäre anders.
-
Aber zurück zum Threadthema: die Operatorenüberladung. Wie ist denn der Zusammenhang von der Operatorenüberladung zu den Streamklassen (ostream os) ???????????
-
Original erstellt von Parapiler:
Aber zurück zum Threadthema: die Operatorenüberladung. Wie ist denn der Zusammenhang von der Operatorenüberladung zu den Streamklassen (ostream os) ???????????keiner.
außer, daß << ein operator ist, den man zum ausgeben überlaen kann,
und new auch ein operator ist, den man überladen kann, wenn man sich langweilt.
-
wie kann man denn << überladen für eine ausgabe?!
-
muss ich dann den Operatorparameter auf einen Ostream typ casten oder wie soll das gehen?!
-
mal ein Beispiel für deinen CVector
ostream& operator<<(ostream& output, const CVector& value)
-
Also der Typ der Überladungsfunktion muss dann ein ostream sein?! wie sähe denn dann der Anweisungsteil aus?!