s.....e
s.....e
#pytanie #programowanie #cpp

wchar_t *pwString = new wchar_t[N];
I teraz to N jest liczbą znaków, czy bajtów?
Mam wątpliwości bo operator new alokuje pamięć, a chcąc wyzerować pamięć przez memset posługujemy się bajtami:

memset(m_pwString, 0, N * sizeof(wchar_t));
  • Najlepsze
  • Wszystkie komentarze
that_ugly_dude
@sheeple: operator new dla tablicy zaalokuje N wchat_t elementów, czyli najpewniej N*2 (wide chary pewnie po 2 bajty)

memset to C API - tam lubią bawić się surowymi bajtami, i musisz podawać liczbę bajtów (analogicznie pointer zwrócony przez malloc musiałbyś scastować z surowych bajtów na cokolwiek konretnego)
lionbest
@sheeple: Ale tak naprawdę lepiej korzystać z std::vector, a jeżeli już koniecznie z new to chociaż z inteligentych wskaźników std::unique_ptr czy std::shared_ptr.
Razi91
@sheeple: memset przyjmuje wskaźnik + ilość bajtów. On nie wie co zeruje i musisz podać rozmiar bloku do wyzerowania.
lionbest
sizeof(wchar_t)


@sheeple: @that_ugly_dude: Na 64bit GCCeku najprawdopodobniej 4 ( ͡° ͜ʖ ͡°)
https://wandbox.org/permlink/YAKSKV9ojAR53EBr
lionbest
@sheeple: Ah zapomniał bym, jak chcesz zaalokować pustą tablicę w C++ to nie kasuj jej memsetem, tylko standardowo zaalokuj wyzerowaną:

wchar_t *pwString = new wchar_t[N]{};
Kompilator może to zoptymalizować i zapytać system o już wyzerowany blok pamięci.
Tutaj przykład:
https://wandbox.org/permlink/mXBnCHeZZr6lfQRb
Do ustawiania konkretnej wartości lepiej używać std::fill;
that_ugly_dude
@Blitzkrung: malloc zwraca void*, raczej mało użyteczny wskaźnik (⌐ ͡■ ͜ʖ ͡■)
that_ugly_dude
@Blitzkrung: 1) to jest C, nie C++, 2) implicit cast to nadal cast, 3) to, że cast się uda, nie znaczy, że jest poprawny (i.e. auto ptr = malloc(...); Foo* foo = malloc(sizeof(Bar)))

proponuję się dokształcić: https://stackoverflow.com/questions/1736833/void-pointers-difference-between-c-and-c
Blitzkrung
Blitzkrung
@that_ugly_dude: Dzięki. Wyszedłem na idiote ( ͡° ͜ʖ ͡°)
Nie zauważyłem że to cpp.
Sorry cumplu!
Blitzkrung
Blitzkrung
@that_ugly_dude: nie zaleca sie castowania wartości zwracanej z malloc
Blitzkrung
Blitzkrung
@that_ugly_dude: Typ void* jest automatycznie i bezpiecznie konwertowany na kazdy inny typ wskaznika.
Proponuje sie doksztalcic https://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc