Ich habe derzeit eine std::ofstream
auf dem Stapel erstellt, und wenn es eine globale operator new
zuweist, die Speicher aus einem vorab zugewiesenen Puffer zuweist, stürzt das Programm danach ab main
schließt den Aufruf von std::locale0 : line 59. Read Access Violation. nodeptr was 0x...
als Programmabsturzpunkt ab. nodeptr
's Speicheradresse ist eine echte Adresse. Ich habe keine Ahnung, warum dies geschieht, und ich kann nur annehmen, dass es daran lag, dass ich missverstehe, was die Zuteilungen tatsächlich tun.std :: fstream stürzt nach main ab, während zuvor zugewiesener Speicher verwendet wird
Dieses Verhalten tritt auf einem release
bauen auf MSVC Version 19.10.25019 x86
getestet, aufbauend auf debug
ohne Absturz des Programms komplett hat. Dr. Memory meldet im Debug-Modus keine Lecks.
Minimal-Code:
#include <fstream>
#include <cstdlib>
std::uint8_t *byte = static_cast<std::uint8_t*>(malloc(134217728)); // 134217728 = 128 MiB
void *operator new(size_t bytes) throw(std::bad_alloc)
{
return static_cast<void*>(byte); // Tested empirically, and this is only called once so this shouldnt be a cause of a problem
}
void operator delete(void *memory) throw()
{}
int main()
{
std::ofstream out("abc");
free(byte);
}
Es scheint nicht, dass der Ersatz neu in einem Debug-Build genannt wird, zumindest in Visual Studio 2017. In einem Release baut den Ersatz new wird nur einmal aufgerufen, und der Absturz scheint beim Bereinigen eines Gebiets zu sein, das Ihrer Beschreibung entspricht. Die Kommentare im Code sprechen davon, faule Facetten zu zerstören. Wenn Sie etwas höher in der Datei schauen, werden Sie sehen, dass es in einem Debug-Build einen Ersatz für die Klasse new/delete gibt. –
@RetiredNinja Es scheint, als wäre dies ein Visual C++ - Bug in Bezug auf benutzerdefinierte Zuordnungen und std :: locale. "std :: locale in CRT geht davon aus, dass alle Facetten dem CRT-Heap zugewiesen werden" - ein Fehlerbericht –