[C++,wskaźniki]-Problem z usuwaniem wskaźników

TDK8GB

Użytkownik
Dołączył
Maj 17, 2013
Posty
105
Mam taki kod:
Kod:
keylogger k;
if(wParam = WM_KEYUP)
{
if(k.hWindow != GetForegroundWindow())
{
k.log = TEXT("\n");
TCHAR * tchar_time = new TCHAR[];
SYSTEMTIME time;
GetSystemTime(&time);
_stprintf(tchar_time,TEXT("%02d:%02d:%02d"),time.wHour,time.wMinute,time.wSecond);
k.log += TEXT("[ Time: ");
k.log += tchar_time;
k.log += TEXT(" ");
k.hWindow = GetForegroundWindow();
int  windowname_length = GetWindowTextLength(k.hWindow);
TCHAR * windowname = new TCHAR[];
GetWindowText(k.hWindow,windowname,windowname_length+1);
k.log += TEXT("Window Name: ");
k.log += windowname;
k.log += TEXT(" ]");
			
delete[] tchar_time;
delete &(time);
delete[] &(windowname_length);
delete[] windowname;
}
}
Gdy dodałem na końcu delete do usuwania to wystąpił appcrash. Jak użyć delete poprawnie?
 
Ostatnia edycja:

meViu

Użytkownik
Dołączył
Kwiecień 8, 2013
Posty
223
Powiem szczerze ten kod jest do bani a Ty nie powinieneś używać wskaźników ani za pisanie keylogger'ów nie znajac podstaw:)

Pozwolę sobie wypunktować:
1)
Kod:
keylogger k
Niewskazane jest (a nawet moim zdaniem NIEDOPUSZCZALNE) nazewnictwo jednoliterowe obiektów, typów, wyliczeń itp (chyba że to zmienna iteracyjna np w pętli). Nazwy te powinny być sensowne.

2)
Kod:
if(wParam = WM_KEYUP)
Warunek ten zawsze zwróci prawdę. Jest różnica między operatorem przypisania (=), a operatorem porównania (==).

3)
Kod:
k.log = TEXT("\n");
Używanie TEXT(), TCHAR jest przestarzałe, nie powinno się już tego używać. Dla aplikacji na platformę Windows jest wskazane używać wchar_t bezpośrednio.

4)
Kod:
TCHAR * tchar_time = new TCHAR[];
A to co to jest ? :O Deklarujesz wskaźnik tchar_time a następnie alokujesz na stercie pusta tablicę i zwracasz do niej wskaźnik ? Zastanowiłeś się na co pokazuje taki wskaźnik ? Pewnie nie, to Ci powiem: wskazuje na NIC :)

Ogólnie rzecz biorac nie jest tutaj potrzebne używanie wskaźników i sterty. Lepiej wyznaczyć maksymalna liczbę znaków dla poszczególnych zmiennych, np dla nazwy okna przyjąć, że maksymalna długość okna może wynieść 256 znaków i zadeklarować takową tablicę na stosie :)
 
Ostatnia edycja:

meViu

Użytkownik
Dołączył
Kwiecień 8, 2013
Posty
223
Radzę doczytać ten dział, wskaźniki to często bardzo przydatne narzędzie, nie da się bez nich obejść w większych projektach i wcale nie są takie trudne do ogarnięcia.

Kod:
keylogger k
Oczywiście można tak, lecz jest to bardzo zły nawyk, tak jak wspomniałem nazwy funkcji, zmiennych, wyliczeń itp powinny być sensowne.

Tak na prawdę, gdybyśmy mieli się pogłębić w szczegóły to WinAPI działa tylko i wyłącznie w UNICODE, wszystkie funkcje w wersji ASCII (z 'A' na końcu) rzeczywiście konwertują przesłany napis na teks unicode i wywołuje odpowiednie funkcje w wersji UNICODE (z 'W' na końcu), dlatego wskazane jest bezpośrednie używanie wchar_t i wersji unikodowych funkcji.
 
Do góry Bottom