Różnica między global non-throwing: operator new i std:: malloc

C++ ma kilka funkcji do pozyskiwania dynamicznej pamięci masowej, z których większość różni się w pewien fundamentalny sposób. Kilka kolejnych jest zwykle dodawanych przez system operacyjny.

Dwa z nich są szczególnie interesujące ze względu na ich przenośność i podobieństwo: malloc i ::operator new.

Czy są jakieś różnice (w.R.T. standard i implementacja) pomiędzy globalnym void* operator new(size_t, ::std::nothrow&) i void* malloc(size_t)?

Ponieważ wydaje się być pewne zamieszanie, o czym mówię, rozważ następujące dwa wywołania:

void* p = ::std::malloc(10);
void* q = ::operator new(10, ::std::nothrow);

Oczywistą i trywialną różnicą jest to, jak dealokować pamięć:

::std::free(p);
::operator delete(q);

UWAGA: To pytanie nie jest duplikatem np. Jaka jest różnica między new / delete a malloc / free? ponieważ mówi o użyciu globalnego operator new to nie wykonuje żadnych połączeń ctor.

Author: plasmacel, 2014-04-24

3 answers

Główne różnice, poza składnią i free vs. delete, to

  1. You can Portable replace ::operator new;
  2. malloc pochodzi z realloc, dla którego new nie ma odpowiednika;
  3. new ma pojęcie new_handler, dla których nie ma malloc odpowiednika.

(zastąpienie malloc otwiera puszkę robaków. Można to zrobić, ale nie przenośnie, ponieważ wymaga znajomości linkera.)

 24
Author: Fred Foo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-01-03 10:24:44

Są dwie różnice, o których myślę:

  1. Której funkcji należy użyć do dealokacji pamięci, operator delete vs. free().

  2. Program C++ może legalnie dostarczyć własną wersję ::operator new i ta wersja jest gwarantowana do wywołania przez wyrażenia new. Nie jest możliwe nadpisanie malloc własną wersją.

 4
Author: Angew is no longer proud of SO,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-24 14:18:33

Makroskopowa różnica, którą widzę bez dalszych badań, polega na tym, że wariant Rzutowy globalnego operatora ::new rzuca std::bad_alloc, jeśli nie można wykonać przydziału, podczas gdy malloc zwraca NULL. Ale wierzę, że większość różnic wymienionych tutaj dotyczy operatora globalnego ::new, nawet jeśli temat dotyczy new.

 1
Author: gd1,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:53:38