[c++]zaalokowanie odpowiedniej liczby bajtów

0

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.

0

char *a = new char[12] zaalokuje tablice char o 12 elementach. I przypisze adres pierwszego elementu do wskaznika.

0

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 :/

0

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??

0

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.

0

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 :)

0

Ludzie przecież wbudowany typ char w C++ zawsze będzie 8-bitowy, o ile nie zdefiniuje się nowego.

0

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.

0

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ć.

0

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.

0

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.

0

No to do tego sluzy malloc() a nie new. I juz! Kto Ci zabrania uzywac malloc()? Nauczyciel?

0

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)

0

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!
0

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.

0

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

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