WinApi vector struktur (crashuje)

0

Witam. Tworzę własną kontrolkę w WinApi i stanąłem na liście. Otóż korzystam w niej z wektorów struktur. Problem polega na tym, że przy dodaniu struktury program się wysypuje. Fragment kodu wygląda mniej - więcej tak:

//deklaracja struktur

 
struct WHLIST_ELEMENT{
    char* tekst;
    char* komentarz;
    int id_ikonki;

    bool aktywny;
    bool zaznaczony;
};
struct WHLIST_PRZYCISK{
    struct WHLIST_ELEMENT *wsk;
    HWND uchwyt;
};
struct WHLIST{
    HWND ScrollBar;
    HBITMAP bitmapa;
    HDC hDC, hDCbmp, hDCobrazki;
    HBITMAP obrazki;

    INT cX, cY;
    vector<WHLIST_ELEMENT> Element;
    vector<WHLIST_PRZYCISK> Przycisk;
}WHLIST;

//fragment kodu odpowiadający dodawaniu kontrolek

 
int ilosc_przyciskow = Y / 22;
for(int n=0; n<ilosc_przyciskow; n++)
{
      struct WHLIST_PRZYCISK przyklad;
      przyklad.uchwyt = CreateWindowEx( 0, "wh_CHECKBOX", NULL, WS_CHILD | WS_VISIBLE | WH_AUTOMAT, 22, n*22, X - 22, 22, hwnd,( HMENU ) 1, GetModuleHandle(NULL), NULL );
      przyklad.wsk = NULL;
      SendMessage(przyklad.uchwyt, WH_SETFOCUS, WH_PRZELACZ, 0);

      wsk->Przycisk.push_back(przyklad); // wysypuje sie ;(
}

wskaźnik wsk z pewnością nie jest NULL, gdyż sprawdzam to już na samym początku. Próbowałem różnych cudactw i dalej wywala. Czytałem, że przyczyną może być zbyt częste wywoływanie push_back() w tym samym czasie. W załączniku dodaję plik main.cpp oraz plik wh_grafika.h. Może uda wam się zauważyć coś, czego ja nie widzę.

2
struct WHLIST *wsk = (struct WHLIST *)malloc(sizeof(struct WHLIST));

Jak piszesz w C++, to używaj C++'owych metod (de)alokacji pamięci, szczególnie że używasz klas (w tym przypadku vector, który nie jest poprawnie konstruowany, ponieważ malloc lub inny alokator z C nie wywoła konstruktora). Użyj new i delete.

p.s. opakuj to wszystko w klasy.

0

Jedyny powód, dla którego to się wysypuje w tym miejscu to uszkodzona sterta.
Ten fragment kodu wygląda poprawnie te vector<WHLIST_PRZYCISK>.push_back nie rożni się specjalnie od vector<int>.push_back.
W innym miejscu programu musiałeś przekroczyć zakres tablicy albo użyć nieważnego wskaźnika lub coś w podobny deseń, co doprowadziło do niespójności sterty.
W momencie odpowiedniej operacji na stercie, niespójność sterty jest wykrywana i program zgłasza poważny błąd.

0

Od którego geniusza 0x666 dostał minusa?

Ewidentnie widać, że problem polega na tym, że autor próbuje wykonać niestatyczną metodę na nieistniejącym (niepoprawnie zainicjowanym) obiekcie.

0

zrobiłem sobie plik z rozszerzeniem .h, w którym umieściłem funckje listy dwuukierunkowej. Chcę je wykorzystać zamiast kontenera. Pokażę mniej więcej na czym polega problem:

 
//main.cpp
#include <windows.h>
#include "wh_grafika.h"
#include "wh_lista.h"
 
//wh_grafika.h
#include <windows.h>
#include "wh_lista.h"

Oba te pliki korzystają z listy, przy czym main.cpp dodatkowo używa pliku wh_grafika.h. Powstają mi błędy (o ile się nie mylę), że zaincludowałem już wh_lista.h.

1

Używaj include guards.

1 użytkowników online, w tym zalogowanych: 0, gości: 1