Hallo zusammen!
Es war relativ schwer einen guten Titel für das Problem zu wählen, mit welchem ich gerade konfrontiert bin, aber ich hoffe, der obige ist für die zukünftig suchenden mit dem gleichen Problem verständlich
.
Ich bin gerade dabei eine Funktion zu schreiben, welche eine Datei abspeichert. Das Format besteht aus Chunks mit Subchunks und so weiter und diese sind somit alle voneinander abhängig. Aus diesem Grund erstelle ich alle Chunks zuerst im Speicher (da die grössten Dateien nicht mehr als 1.5 MB sind nicht weiter ein Problem) und erstelle anschliessend die Verknüpfungen untereinander und speichere sie dann.
Allerdings stehe ich gerade vor einem äusserst merkwürdigen Problem. Nach einer Anweisung im Speichervorgang ist es mir nicht mehr möglich mehr als 367 Bytes über new zu allozieren. Ich kann zwar 367 mal ein Byte allozieren, aber sobald die Summe der Allokationen 367 Bytes überschreitet erhalte ich eine std::bad_alloc-Exception. Dass ich zu wenig freien Speicher habe denke ich kaum, benötigt das Programm an sich lediglich knapp 100 MB Speicher und ist auch das System sonst kaum ausgelastet.
Hier ein bisschen Code zur Verdeutlichung:
Merkwürdig ist jedoch, dass alles glatt läuft, wenn ich nicht std::copy verwende:
Weiss jemand vielleicht, warum das so ist? Ich würde eigentlich gerne std::copy verwenden, aber bin momentan gezwungen es über die Schleife selbst zu machen.
/Edit:
Zu früh gefreut, es liegt wohl doch nicht an std::copy. Auch in der zweiten Variante ist der Speicher nicht unbeschränkt allozierbar, aber deutlich mehr. NIcht nur 367 Bytes, sondern 2000-3000 Bytes. Ich bin ehrlich gesagt echt ratlos, wie mein System bei solch minimalen Mengen Fehler produzieren kann...
Gruss
Cromon
Es war relativ schwer einen guten Titel für das Problem zu wählen, mit welchem ich gerade konfrontiert bin, aber ich hoffe, der obige ist für die zukünftig suchenden mit dem gleichen Problem verständlich

Ich bin gerade dabei eine Funktion zu schreiben, welche eine Datei abspeichert. Das Format besteht aus Chunks mit Subchunks und so weiter und diese sind somit alle voneinander abhängig. Aus diesem Grund erstelle ich alle Chunks zuerst im Speicher (da die grössten Dateien nicht mehr als 1.5 MB sind nicht weiter ein Problem) und erstelle anschliessend die Verknüpfungen untereinander und speichere sie dann.
Allerdings stehe ich gerade vor einem äusserst merkwürdigen Problem. Nach einer Anweisung im Speichervorgang ist es mir nicht mehr möglich mehr als 367 Bytes über new zu allozieren. Ich kann zwar 367 mal ein Byte allozieren, aber sobald die Summe der Allokationen 367 Bytes überschreitet erhalte ich eine std::bad_alloc-Exception. Dass ich zu wenig freien Speicher habe denke ich kaum, benötigt das Programm an sich lediglich knapp 100 MB Speicher und ist auch das System sonst kaum ausgelastet.
Hier ein bisschen Code zur Verdeutlichung:
Code:
mwid.size = 4 * m_wmids.size();
if(mwid.size)
{
mwid.data = new ui8[mwid.size];
std::copy(m_wmids.begin(), m_wmids.end(), (ui32*)mwid.data);
}
// Ab hier kann ich nicht mehr als 367 Bytes allozieren!
Merkwürdig ist jedoch, dass alles glatt läuft, wenn ich nicht std::copy verwende:
Code:
mwid.size = 4 * m_wmids.size();
if(mwid.size)
{
mwid.data = new ui8[mwid.size];
ui32* tmp = (ui32*)mwid.data;
for(ui32 i = 0; i < m_wmids.size(); ++i)
tmp[i] = m_wmids[i];
}
// Hier kann ich unbeschränkt allozieren
Weiss jemand vielleicht, warum das so ist? Ich würde eigentlich gerne std::copy verwenden, aber bin momentan gezwungen es über die Schleife selbst zu machen.
/Edit:
Zu früh gefreut, es liegt wohl doch nicht an std::copy. Auch in der zweiten Variante ist der Speicher nicht unbeschränkt allozierbar, aber deutlich mehr. NIcht nur 367 Bytes, sondern 2000-3000 Bytes. Ich bin ehrlich gesagt echt ratlos, wie mein System bei solch minimalen Mengen Fehler produzieren kann...
Gruss
Cromon
Zuletzt bearbeitet: