Przejdź do treści
MQL5 · MetaTrader 5 · po polsku
kod odczarowany

MQL5 / Błędy

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 4012

Co 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:

Zerowanie po usunięciu i kontrola przed użyciem
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.

Powiązane