Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

29.12.2013, 22:21

Heap Corruption - ich finde den fehler nicht

Hallo liebe Community,

den ganzen Tag suche ich schon nach diesem einen Fehler, der mich zum verzweifeln bringt. Das Programm stürzt ab mit der Meldung "Windows hat einen Haltepunkt in Zatacka.exe ausgelöst", der Debugger verweist auf die Zeile: "

Quellcode

1
_Ptr = this->_Alval.allocate(_Newres + 1);
in der datei xstring. Der Fehler tritt nur in der Release Version des Programms auf. Ich konnte den Fehler soweit eingrenzen, dass ich weiß wo er entsteht, nämlich beim Verlassen dieser Methode:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
void Lobby::processConnection()
{
    std::string buffer;
    if(!mConnection->IsAlive())
    {
        mConnected = false;
        mNumberOfMenuPoints = 2;
        mFirstPointY = 280;
    }
    if(mConnection->GetBuffer(buffer))
    {
        std::string code = buffer.substr(0, 7);
        std::string content = buffer.substr(7, std::string::npos);
        if(code.compare("Player:") == 0)
        {
            int i = 0;
            do 
            {
                size_t position = content.find_first_of('\n');
                mPlayerNames[i] = content.substr(0, position);
                content = content.substr(position+1, std::string::npos);
                i++;
            }
            while(!content.empty());
        }
    }
}
Das Problem tritt nicht auf, wenn man die zweite if-Abfrage der Methode (die mit GetBuffer) komplett auskommentiert. Nach Recherche im Internet habe ich herausgefunden, dass es möglich ist, dass reservierter Speicher zweimal freigegeben wird oder aber etwas in einer dll nicht stimmt. Die Klasse des Objektes mConnection stammt aus einer implizit gelinkten dll. Da ich mir ziemlich sicher bin, dass der Fehler im Zusammenhang mit der GetBuffer-Methode auftritt, hier noch der Code dieser Methode (mInputBuffer ist vom Typ std::queue<std::string>)

Quellcode

1
2
3
4
5
6
7
8
9
10
//returns the first entry in the input buffer
Bool CConnection::GetBuffer(std::string& Buffer)
{
    if(mInputBuffer.empty()) return false;

    Buffer = mInputBuffer.front();
    mInputBuffer.pop();

    return true;
}

Auch hier kann ich keinen Fehler finden. Ich bitte um eure Hilfe, da ich selber nach vielen Stunden der Fehlersuche keine Ideen mehr habe und hoffe das es hier jemanden gibt, der erfahrener ist mit sowas als ich.