2013-06-01 5 views
7

Miałem jedno pytanie.C++ new * char nie są puste

Rozwijam serwer w ASIO, a pakiety są spiczaste.

Kiedy tworzę nowy znak (np. char * buffer = new char[128];) muszę wyczyścić go ręcznie do wartości null.

przez:

for(int i =0;i<128;i++) 
{ 
buffer[i] = 0x00; 
} 

robię coś złego, że znak nie jest jasne?

+0

Na twoje pytanie odpowiada już [Zrób nawiasy po zmianie nazwy na nowy?] (Http://stackoverflow.com/questions/620137/do-the-parentheses-after-the-type-name -make-a-difference-with-new). – Troubadour

Odpowiedz

19

Nie trzeba do pętli nad tablicy wartości un-zainicjowany. Można dynamicznie wystąpienia tablicę zerami tak:

char * buffer = new char[128](); // all elements set to 0 
          ^^ 
3

Przydzielona pamięć nie będzie wolna, będzie zawierała losowe rzeczy. W ten sposób działa alokacja pamięci. Musisz albo uruchomić aplikację for -lub albo użyć memset, aby usunąć ją ręcznie.

-5

Ponieważ jest to wskaźnik, trzeba to zrobić tak:

for(int i = 0; i < 128; i++) 
{ 
(buffer + i) = 0x00; 
} 
+1

-1: Kod jest niepoprawny (przypisanie 0x00 do wartości r) i rada jest zła (kod OP kompiluje się, a twój nie). – milleniumbug

+0

1. Zapomniałeś dereferencji LHS, więc próbujesz przypisać do wartości r (twój kod się nie skompiluje). 2 'buffer [i]' jest według standardu językowego tak samo jak '* (buffer + i)'. Podczas gdy tablice i wskaźniki * SĄ * różne w zależności od standardu językowego w tym kontekście, są do pewnego stopnia zamienne. –

11

Istnieją dwa rodzaje sposobów wywołanie nowego operatora w C++ - domyślnie włączona i zerowy zainicjalizowana.

do domyślnych inicjalizacji (co pozostawi wartość niezdefiniowana) połączenia:

int * i = new int; 

Jest wówczas niezdefiniowane behavoir czytać lub użyć tej wartości aż do jego zostały ustawione.

Aby zeroinitialise (który będzie ustawiony na 0) używać:

int * i = new int(); 

ta działa również z tablicami:

int * i = new int[4]; // ints are not initialised, you must write to them before reading them 
int * i = new int[4](); // ints all zero initialised 

Jest trochę więcej informacji here

2

Można również użyć calloc. Inicjuje każdy elem na 0 automatycznie. np:

char* buffer = (char *) calloc (128, sizeof (char)) 

Pierwszy param jest liczba bloków, które zostaną przyznane. Drugi to rozmiar bloku. Funkcja zwraca void *, więc musisz przekonwertować jej wartość na (char *) Jeśli używasz calloc (lub malloc lub jakiejkolwiek funkcji alokacji "czystego c"), lepiej użyć funkcji free, aby zwolnić pamięć, zamiast usuwać.