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.
3 answers
Główne różnice, poza składnią i free
vs. delete
, to
- You can Portable replace
::operator new
; -
malloc
pochodzi zrealloc
, dla któregonew
nie ma odpowiednika; -
new
ma pojęcienew_handler
, dla których nie mamalloc
odpowiednika.
(zastąpienie malloc
otwiera puszkę robaków. Można to zrobić, ale nie przenośnie, ponieważ wymaga znajomości linkera.)
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ę:
Której funkcji należy użyć do dealokacji pamięci,
operator delete
vs.free()
.Program C++ może legalnie dostarczyć własną wersję
::operator new
i ta wersja jest gwarantowana do wywołania przez wyrażenianew
. Nie jest możliwe nadpisaniemalloc
własną wersją.
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
.
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