Windows hat einen Haltepunkt ausgelöst - Beschädigung des Heaps



  • Hab das Problem ungefähr lokalisieren können, aber ich weis nicht was da Schief läuft.
    Ich hab da eine Klasse die nen vector für chars enthält, sollte nur dafür sein dass ich mit weniger code bei Winsocks char arrays senden kann. So sieht die Klasse aus:

    class Packet
    {
    private:
    	char* tmpstr;
    public:
    
    	vector<char> v;
    
    	Packet();
    	~Packet();
    
    	void put(char c);
    	void clear();
    	char* getPacket();
    	int size();
    	void freeBuffer();
    
    };
    

    wahrscheinlich liegt das Problem in der Funktion:

    char* Packet::getPacket()
    {
    	if(size()==0)
    		return NULL;		
    
    	tmpstr= new char[size()];
    	return tmpstr;
    }
    

    Stimmt da was nicht? Ich erstelle ein neues char-array mit der Größe der Anzahl der Elemente im vector, kurz danach wird auf jeden Fall das Array wieder freigegeben mit dieser Funktion:

    void Packet::freeBuffer()
    {
    	delete[] tmpstr;
    }
    

    Die Funktion wird unter anderem im Destruktor aufgerufen.

    Hat jemand ne Idee?



  • Wieso mischst du vector und rohe Arrays? Das ist wirklich sinnlos. Mit &v[0] kommst du an die Rohdaten des Vektors.



  • Ich muss zum senden über Winsocks ein char* übergeben, das ist der einzige Grund für die Benutzung dieser Klasse. Sollte das ganze bisschen einfacher machen.



  • seldsam schrieb:

    Mit &v[0] kommst du an die Rohdaten des Vektors.

    Also

    class Packet
    {
        vector<char> v;
        char* getPacket() { return &v[0]; }
    };
    


  • @TE:
    Selbst wenn das viel einfacher geht, solltest du RAII lernen.
    Ressourcen werden im Konstruktor erzeugt und im Destruktor freigegeben.



  • Wenn, dann bitte auch v.data(). Das funktioniert auch bei leeren Vektoren.



  • Das Problem ist jetzt behoben, obwohl ich nicht weis wieso das Programm bei dem Code vorher nicht ging...

    Noch ein Problem: Ich versuche möglichst einfach aus einem char array ein int und ein short für ip Adresse und port Nummer rauszubekommen. Habe es so versucht:

    addr.sin_addr.s_addr=*((int*)buffer+4);
    

    funktioniert irgendwie nicht. Jemand nen Vorschlag?



  • Das Problem ist jetzt behoben, obwohl ich nicht weis wieso das Programm bei dem Code vorher nicht ging...

    Dann wär ich mir nicht sicher dass es behoben ist..

    funktioniert irgendwie nicht. Jemand nen Vorschlag?

    Klar funktioniert das - du bekommst doch Zahlen oder ? Nur halt 'zufällige'. 🤡

    Mit deiner Variante werden die chars nur als integer neuinterpretiert, das würde also nur gehen wenn die zahlen binär in dem array vorliegen; was du suchst ist eine Konvertierung wie hier



  • Die Zahlen sind binär in dem Array, aber irgendwas läuft da falsch.
    Zum Beispiel wenn ich zu google verbinde bekomme ich ein array mit 173,194,69,17.
    Das ist die IP adresse die ab dem vierten Feld anfängt. Nachdem ichs gespeichert hab in dem struct wird aber nur ausgegeben 0.81.0.0.
    Das versteh ich nicht.

    Edit: hat den Fehler keiner entdeckt? So muss es richtig sein:

    (*(int*)(buffer+4));
    

    Da müssen Klammern um buffer+4, ich glaub wenn die nicht da sind wird zu dem int pointer 4x die Größe von int hinzu addiert, also 16 Stellen weiter...



  • hat den Fehler keiner entdeckt? So muss es richtig sein:

    Woher sollen wir denn wissen ob deine Daten an der 4. oder der 16. Stelle liegen ? 🙄

    Und wie hast du jetzt das Problem mit der Heapbeschädigung gelöst ? Ich glaube immer noch dass es gerade nur durch Glück nicht crasht..



  • Ich hab den Teil entfernt wo ich mit new ein char array erstelle. Stattdessen lasse ich mir die Adresse des ersten Elements im Vector zurückgeben:

    return &v[0];
    

    Würde deswegen gerne wissen wie es richtig wäre wenn ich das mit new [] gemacht hätte.


Log in to reply