PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : HEAP Exception



MistaPink
22-03-2010, 19:01
Hallo,

ich versuche über einen HTTP-Stream zu lesen.
Dort gibt es bei HTTP/1.1 leider das Problem, dass es "chunked" Bodies gibt. Nachdem ich jetzt alle Daten aus dem TCP-Stream gelesen habe, würde ich gerne ein Postprocessing des Bodys machen. Dazu nutze ich folgende Schleife:



char* buf_ = new char[chunk_size];
sstream.read(buf_, 3); // std::stringstream sstream;
while (chunk_size > 0)
{
sstream.read(buf_, chunk_size);
hr.append_to_response(std::string(buf_, chunk_size));
sstream >> chunk_size_string;
chunk_size = hexstring_to_int(chunk_size_string);
delete[] buf_; // HEAP Exception!
buf_ = new char[chunk_size];
sstream.read(buf_, 4);
}
delete[] buf_;


Leider schmiert das ganze beim delete[] buf_; ab. Ohne delete[] läuft die Schleife ein paar mal durch und stürtzt dann beim buf_ = new char[chunk_size]; ebenfalls mit einer HEAP Exception ab.

Es besteht natürlich die Möglichkeit das ganze auch mit einem statischen char-Array zu machen, nur hab ich nicht rausfinden können, ob es eine maximale Größe der einzelnen Chunks gibt.

Vielleicht kann mir jemand sagen, warum die Schleifen so nicht funktioniert?


Viele Grüße
MistaPink

peschmae
23-03-2010, 21:24
Was nimmt denn chunk_size_string/chunk_size so für Werte an?

Eventuell läuft beim einlesen des chunk_size_string was falsch - woher weiss der sstream genau, wieviel er in den chunk_size_string reinlesen muss damit das alles schön funktioniert?

In jedem Schleifendurchlauf Speicher zu belegen und freizugeben ist natürlich äusserst unschön und auch nicht gerade schnell. Wäre natürlich nett wenn sich das irgendwie vermeiden liesse... ;)
Du könntest ja auch mit fixem Buffer arbeiten und halt jeweils nur bis zu "min(chunk_size, buffer_size)" lesen oder so was in die Richtung.

MfG Peschmä

MistaPink
25-03-2010, 12:37
Hallo Peschmä,

also die chunk__size kann alles sein von 2 bis 485. Prinzipiell habe ich keine Beschränkung in der RFC gefunden. Der Stringstream funktioniert genauso wie andere Streams, d.h. er liest bis zum Whitespace oder Steuerzeichen (nehme ich mal an). Ein Chunk sieht dann beispielsweise so aus:


3b1
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>wikipedia.de - Wikipedia, die freie Enzyklop&auml;die</title>
<link rel="stylesheet" media="screen" type="text/css" href="style.css" />
<script language="JavaScript" type="text/javascript" src="suggest.js"></script>
</head>

<body onload="self.focus();document.getElementById('txtSearch'). focus();">
<center>

<table id="head" border="0" cellpadding="0" cellspacing="0" style="width:100%">
<tr>
<td style="text-align:left; padding:.5em 1em; width:20em; vertical-align:top;">Die Hauptseite der deutschsprachigen Wikipedia finden Sie unter <a href="http://de.wikipedia.org">http://de.wikipedia.org</a>.</p>

<td style="text-align:center; vertical-align:top;">

D.h. ich lese als erstes den String 3b1 und wandle den in einen Integer (925). Dann lese ich aus dem Stringstream 925 Zeichen in buf_ und lasse mir daraus einen String generieren. Am Ende kommen halt wieder Steuerzeichen, darum lese ich einfach zwei Zeichen in den buf_ da diese eh wieder überschrieben werden. Danach geht das ganze von vorne los. Der Code unten ist mittlerweile nicht mehr ganz aktuell, da es nur zwei Steuerzeichen sind, die nach der Chunksize eingelesen werden.



In jedem Schleifendurchlauf Speicher zu belegen und freizugeben ist natürlich äusserst unschön und auch nicht gerade schnell. Wäre natürlich nett wenn sich das irgendwie vermeiden liesse...
Du könntest ja auch mit fixem Buffer arbeiten und halt jeweils nur bis zu "min(chunk_size, buffer_size)" lesen oder so was in die Richtung.

Stimmt sicherlich nicht effizient ist, aber auf die simple Idee, dass Minimum von Chunksize und Buffergröße zu nehmen, bin ich irgendwie nicht gekommen. Ich denke, dass das sicherlich am Besten ist.

Viele Grüße,
MistaPink