2014-07-01 5 views
7

Zobacz powiązane pytanie.Dlaczego zastąpienie malloc() wymaga znajomości linkera, ale :: operator new() nie działa?

Difference between global operator new and malloc

Przyjęte stany odpowiedź,

„Wymiana malloc otwiera puszkę Pandory. Można to zrobić, ale nie przenośnie, gdyż wymaga znajomości łącznikiem”.

Dlaczego zastąpienie malloc wymaga znajomości linkera i dlaczego zastąpienie :: operator new() nie?

+0

Ten sam powód, dla którego można przesłać dalej, deklaruje, jeśli masz tylko wskaźnik, ale potrzebujesz pełnego włączania, jeśli masz instancję obiektu. http://stackoverflow.com/questions/553682/when-can-i-use-a-forward-declaration?rq=1 – CoryKramer

+0

Oświadczenie z połączonej odpowiedzi mówi "3. new ma koncepcję new_handler, dla której nie ma odpowiednika Malloc. ". IMHO, które nie jest w 100% prawdziwe. Zwykle jest kilka słabych symboli zadeklarowanych w bibliotece underyling c, które mogą być _ overridden_ ​​z twoimi własnymi implementacjami (zobacz np. ['_sbrk'] (http://en.wikipedia.org/wiki/Sbrk)). Zadeklarowane słabe symbole niekoniecznie muszą zawierać słowo "linker". –

Odpowiedz

7

Standardowy C++ umożliwia nadpisanie ::operator new. Chociaż implementacja jest z pewnością chaotyczna i związana z linkerem, program C++ może po prostu zdefiniować inny ::operator new i działa. Standard C++ wyraźnie mówi: Programy mogą zastąpić je własnymi definicjami (itd. Itd. Różne ograniczenia i szczegóły).

malloc Z drugiej strony jest zwykłą funkcją zdefiniowaną w zwykłej bibliotece, a C (i C++, jeśli o to chodzi) nie ma możliwości zastąpienia takiej funkcji. Możesz przekonać praktycznie każdy linker pod słońcem, aby połączyć się z twoim libc sans i rozwiązać odniesienia do malloc do jakiegoś kodu z innego pliku biblioteki/obiektu. Ale nie możesz po prostu zdefiniować innych funkcji, ponieważ narusza to zasadę jednej definicji: kończy się to na dwóch funkcjach zwanych "malloc" w programie, co jest zabronione przez standard (dla nie-static, nieanonimowe - namespace, non-inline, ... funkcje) i poważny problem dla łączników (najprawdopodobniej błąd lub jedna z dwóch definicji zostanie usunięty).

Powiązane problemy