Jak mogę używając operatora new przydzielić odpowiednią liczbę bajtów? W C używam malloc(12). W C++ mogę tak char *a = new char[12] i prawdopodobnie zaalokuje 12 bajtów ale jeżeli rozmiar char będzie inny niż 1 bajt (co może się zdarzyć) to przydziele za dużo pamięci. Muszę koniecznie używać new.
char *a = new char[12] zaalokuje tablice char o 12 elementach. I przypisze adres pierwszego elementu do wskaznika.
char *a = new char[12] zaalokuje tablice char o 12 elementach. I przypisze adres pierwszego elementu do wskaznika.
Ale to nie musi miec rozmiaru 12 bajtow. Bo np. char moze miec 6 bitow. W C, wszystko zalezy od platformy.
Chociaz z drugiej strony, zalezy co rozumiemy przez bajt. Przyzwyczailismy sie, ze bajt, to 8 bitow. Ale na maszynach 4-bitowych, sa to 4-bity :/
Na upartego możesz tak:
char *a = new char[12/sizeof(char)];
Zadziała, jeżeli char będzie miał rozmiar 1,2,3,4,6 lub 12 bajtów. W innych wypadkach możesz wywalić błąd :]
A jaki problem, żeby dołączyć cstdlib/stdlib.h i użyć malloc??
A jaki problem, żeby dołączyć cstdlib/stdlib.h i użyć malloc??
Taki, że muszę potem używać new z nagłłówka <new> w formie new(bufor) typ;
Wolę nie mieszać new i malloc.
char *a = new char[12] zaalokuje tablice char o 12 elementach. I przypisze adres pierwszego elementu do wskaznika.
Ale to nie musi miec rozmiaru 12 bajtow.
Ja napisalem ze zaalokuje tablice na 12 elementow char nie 12 bajtow :)
Ludzie przecież wbudowany typ char w C++ zawsze będzie 8-bitowy, o ile nie zdefiniuje się nowego.
Na upartego możesz tak:
char *a = new char[12/sizeof(char)];
To nic nie wnosi do tego co napisal Dryo, poniewaz standard okresla, ze sizeof(char) jest zawsze rowny 1 i nie musi to byc 8 bitow.
Ja tak po najmniejszej linni oporu. Skoro new jest to dynamiczne przydzielenie pamięci to moim zdaniem w chwili jej przydzielania prawdopodobnie zna rozmiar danego typu i przydziela tyle ile trzeba. To tylko moja opinnia więc moge się mylić.
char *a = new char[12] - w ten sposob utworzysz tablice 12 elementow char, a po co ci przydzielac okreslona ilosc bajtow? po to jest new, zeby sie z tym nie babrac.
a po co ci przydzielac okreslona ilosc bajtow? po to jest new, zeby sie z tym nie babrac.
A no po to żeby sobie stworzyć bufor i podczas działania aplikacji nie przydzielać już pamięci dynamicznie tylko korzystać z bufora. np.:
char *a = memory->alloc(sizeof(char));
int *b = memory->alloc(sizeof(int));
Żeby coś takiego napisać musze mieć pewność że przydzieliłem np.: 12 bajtów a nie 12 charów, których wielkość jest zależna od komputera.
No to do tego sluzy malloc() a nie new. I juz! Kto Ci zabrania uzywac malloc()? Nauczyciel?
No to do tego sluzy malloc() a nie new. I juz! Kto Ci zabrania uzywac malloc()? Nauczyciel?
Nie pisze tego na lekcje/zaliczenie :p
Muszę użyć new ponieważ potem będe używał opartora new w formie new (bufor) typ(wartosc)
No to co z tego? A gdzie jest napisane, ze nie mozesz uzywac new(bufor) dla bufora zaalokowanego przez malloc()?
Powiem wiecej, musza dzialac nawet takie rzeczy (choc sa bardzo nieliczne sytuacje
kiedy wolno tak zrobic):
class A { };
A* obiekt = new A;
obiekt->~A();
free(obiekt); //laczenie new z free: nie ma bledu!
No to co z tego? A gdzie jest napisane, ze nie mozesz uzywac new(bufor) dla bufora zaalokowanego przez malloc()?
A chociażby w "Język C++" Bjarne Stroustrup jest napisane żeby nie mieszać new i malloc.
bufor tworzysz na podstawie stalej wartosci, a new jest do DYNAMICZNEGO przydzielania pamieci. i jesli potrzebujesz czegos co i dynamicznie bedzie zmieniac rozmiar to wykorzystaj kontenery, albo stworz wlasny na podstawie szablonow