Zalecane, 2024

Wybór Redakcji

Różnica między nowymi i malloc ()

Nowe i malloc () są używane do dynamicznego przydzielania pamięci. Chociaż nowe i malloc () są różne w wielu kontekstach. Podstawową różnicą między new i malloc () jest to, że new jest operatorem, używanym jako konstrukcja. Z drugiej strony malloc () jest standardową funkcją biblioteczną, wykorzystywaną do alokacji pamięci w czasie wykonywania. Pozostałe różnice między nimi są omówione poniżej w tabeli porównawczej:

Wykres porównania

Podstawa do porównaniaNowymalloc ()
JęzykOperator new jest specyficzną cechą C ++, Java i C #.Funkcja malloc () jest cechą C.
Natura"nowy" jest operatorem.malloc () jest funkcją.
rozmiar( )nowy nie potrzebuje operatora sizeof, ponieważ ma wystarczającą ilość pamięci dla określonego typumalloc wymaga od operatora sizeof określenia rozmiaru pamięci, który ma przydzielić.
KonstruktorOperator new może wywołać konstruktor obiektu.malloc () nie może w ogóle nawiązać połączenia z konstruktorem.
InicjalizacjaOperator new mógł zainicjować obiekt podczas przydzielania do niego pamięci.Inicjacji pamięci nie można było wykonać w malloc.
PrzeciążenieOperator nowy może być przeciążony.Funkcja malloc () nigdy nie może być przeciążona.
NiepowodzenieW przypadku niepowodzenia operator new zgłasza wyjątek.W przypadku niepowodzenia funkcja malloc () zwraca wartość NULL.
DeallocationPrzydział pamięci według nowego, zwalniany przy użyciu "delete".Alokacja pamięci przez malloc () jest deallocated za pomocą funkcji free ().
RealokacjaNowy operator nie przydziela ponownie pamięci.Pamięci przydzielone przez malloc () można ponownie przydzielić za pomocą realloc ().
WykonanieOperator new skraca czas wykonania.Funkcja malloc () wymaga więcej czasu na wykonanie.

Definicja nowego

Operator new jest operatorem przydzielania pamięci, który dynamicznie alokuje pamięć. Nowy operator przydziela pamięć w stercie i zwraca adres początkowy tej pamięci, która jest przypisana do zmiennej referencyjnej. Nowy operator jest podobny do malloc () w C. Jednak kompilator C ++ jest kompatybilny z malloc (), ale najlepiej jest użyć nowego operatora, ponieważ ma pewne zalety w porównaniu z malloc (). Składnia nowego operatora jest następująca:

 type nazwa_zmiennej = nowy typ (lista parametrów); 

Tutaj "typ" oznacza typ danych zmiennej, dla której należy przypisać pamięć. Słowo "nazwa_zmiennej" jest nazwą nadawaną zmiennej referencyjnej, która przechowuje wskaźnik do pamięci. W nawiasie podano tutaj wywołanie konstruktora. Lista parametrów jest listą wartości przekazywanych do konstruktora w celu zainicjowania nowo utworzonego obiektu.

Nowy operator przydziela wystarczającą ilość pamięci wymaganą dla obiektu określonego typu. Dlatego też nie wymaga operatora sizeof () ani nie wymaga zmiany rozmiaru pamięci, jak malloc (), która używa realloc () do ponownego przydzielenia pamięci. Nowy operator jest konstruktem; wywołuje konstruktor obiektu podczas deklaracji, która jest zwykle używana do zainicjowania obiektu.

Wiemy, że nowy operator przydziela pamięć w stercie, a rozmiar sterty jest ograniczony. Tak więc, jeśli sterty brak pamięci i nowy operator próbuje przydzielić pamięć, doprowadzi to do awarii nowego operatora. Jeśli nowy operator nie może przydzielić pamięci, wygeneruje wyjątek i jeśli twój kod nie będzie w stanie obsłużyć tego wyjątku, program zakończy się nieprawidłowo.

Pamięć przydzielona przez operatora new może zostać zwolniona za pomocą operatora delete. Nowy operator odcina czas wykonania, ponieważ jest operatorem, a nie funkcją.

Definicja malloc ()

Funkcja malloc () jest funkcją, która służy do przydzielenia żądanej ilości pamięci na stercie. Metoda zwraca wskaźnik typu 'void', który jest dalej, typ cast, aby uzyskać wskaźnik do pamięci określonego typu, a ten wskaźnik do pamięci jest przypisany do zmiennej referencyjnej. Funkcja malloc () jest podobna do nowego operatora w C ++, ponieważ jest używana do dynamicznego przydzielania pamięci. Funkcja malloc () jest standardową funkcją biblioteki. Składnia funkcji malloc () jest następująca:

 type variable_name = (type *) malloc (sizeof (type)); 

W tym przypadku "typ" wskazuje typ danych zmiennej, dla której należy przypisać pamięć. Zmienna nazwa_zmiennej to nazwa zmiennej referencyjnej, do której zostanie przypisany wskaźnik zwrócony przez funkcję malloc (). (Typ *) opisuje rzutowanie typu, aby uzyskać wskaźnik do pamięci określonego typu. Wielkość sizeof () opisuje malloc (), że jaki rozmiar pamięci jest wymagany.

Funkcja malloc () wymaga odlewania, ponieważ wskaźnik zwracany przez malloc () jest typu pustego, więc aby przypisać typ do wskaźnika, wymagane jest podanie odlewania. Rozmiarof () jest wymagany, ponieważ funkcja malloc () przydziela pamięć surową, dlatego wymagane jest podanie funkcji malloc (), jaką wielkość pamięci musi ona przydzielić. Jeśli przydzielona pamięć nie jest wystarczająca, można ją zmienić lub ponownie przydzielić za pomocą realloc ().

Funkcja malloc () przydziela pamięć na stercie. W przypadku, gdy sterty brakuje pamięci, funkcja malloc () zwraca wskaźnik NULL. Dlatego zmienna referencyjna zawierająca wskaźnik zwrócony przez funkcję malloc () powinna zostać sprawdzona przed użyciem, w przeciwnym razie może spowodować awarię systemu.

Pamięć przydzielona przez funkcję malloc () jest deallocated za pomocą free (). Ponieważ wywołanie funkcji prowadzi do narzutu, funkcja malloc () wymaga więcej czasu na wykonanie.

Kluczowe różnice między nowymi i malloc ()

  1. Nowy operator jest konstrukcją wprowadzoną w C ++ i używaną w Javie, C #, itp. Z drugiej strony malloc () jest standardową funkcją biblioteczną występującą tylko w języku C i obsługiwaną przez C ++.
  2. Nowy operator przydziela wystarczającą ilość pamięci dla obiektu określonego typu, więc nie wymaga operatora wielkości. Z drugiej strony, funkcja malloc () wymaga operatora sizeof (), aby funkcja wiedziała, jaki rozmiar pamięci musi przeznaczyć.
  3. Nowy operator może wywołać konstruktor obiektu podczas deklaracji. Z drugiej strony funkcja malloc () nie może wywołać konstruktora.
  4. Operator "nowy" może być przeciążony, ale malloc () nie może.
  5. Jeśli nowy operator nie może przydzielić pamięci, zgłasza wyjątek, który musi być obsługiwany przez kod, który zakończy program. Z drugiej strony funkcja malloc () zwraca wskaźnik NULL, jeśli nie może przydzielić pamięci. Jeśli wskaźnik zostanie użyty bez sprawdzenia tego, spowoduje to awarię systemu.
  6. Pamięć przydzielona za pomocą nowego operatora może zostać zwolniona przy użyciu polecenia "usuń". Z drugiej strony pamięć przydzieloną za pomocą funkcji malloc () można zwolnić za pomocą funkcji free ().
  7. Po przydzieleniu pamięci za pomocą nowego operatora, nie można jej zmienić. Z drugiej strony pamięć przydzielona za pomocą funkcji malloc () może zostać ponownie przydzielona (zmiana rozmiaru) za pomocą funkcji realloc ().
  8. Czas wykonania nowego jest mniejszy w porównaniu do malloc (), ponieważ malloc jest funkcją, a new jest konstrukcją.

Wniosek:

Funkcja malloc () jest starym sposobem dynamicznego przydzielania pamięci. Obecnie nowy operator jest używany do przydzielania pamięci w czasie wykonywania, ponieważ ma pewne zalety w porównaniu z malloc ().

Top