bład wykonania 4012
4012 — ERR_INVALID_POINTER
Odwołanie przez wskaźnik, który nie wskazuje na istniejący obiekt. `delete` zwalnia obiekt, ale nie zeruje wskaźnika. Zmienna nadal zawiera
1 fragment kodu z tej strony przeszedł przez kompilator MetaEditor build 6090, 2026-08-05.
2026-08-03 11:02:17.441 Ekspert (EURUSD,H1) invalid pointer access, blad 4012Co ten kod znaczy
Program sięgnął po obiekt przez wskaźnik, który jest pusty, nigdy nie został zainicjowany albo wskazuje na obiekt już usunięty.
Skąd się bierze
- odwołanie po
delete, bez wyzerowania wskaźnika - wskaźnik zadeklarowany i nigdy nie ustawiony
- kopia wskaźnika przechowana po zniszczeniu obiektu, na który wskazywał
- obiekt automatyczny, który wyszedł poza zasięg, a wskaźnik na niego został
Co z tym zrobić
delete zwalnia obiekt, ale nie zeruje wskaźnika. Zmienna nadal zawiera adres, pod którym nic już nie ma — i właśnie ta sytuacja jest źródłem większości wystąpień tego kodu. Objaw bywa opóźniony o godziny, bo pamięć pod starym adresem przez jakiś czas wygląda sensownie.
Zabezpieczenie jest dwuczęściowe i obie części są potrzebne:
class CStrategia { };
CStrategia *strategia = new CStrategia();
if(CheckPointer(strategia) == POINTER_DYNAMIC)
{
delete strategia;
strategia = NULL; // bez tego wskaznik dalej wyglada na wazny
}
//--- przed kazdym uzyciem
if(CheckPointer(strategia) == POINTER_INVALID)
{
Print("Wskaznik strategii nie wskazuje na obiekt.");
return;
}CheckPointer zwraca POINTER_DYNAMIC dla obiektów utworzonych przez new, POINTER_AUTOMATIC dla zadeklarowanych zwyczajnie i POINTER_INVALID dla pustych. Wywołanie delete na wskaźniku automatycznym jest błędem — stąd sprawdzenie typu, a nie samo porównanie z NULL.