Standart C++, ::operator new
'un geçersiz kılınması için gereken koşulları sağlar. Uygulama kesinlikle dağınık ve bağlayıcı ile ilgili olsa da, bir C++ programı farklı bir ::operator new
tanımlayabilir ve çalışır. C++ standardı açıkça şöyle diyor: Programlar bunları kendi tanımlarıyla (vb. Çeşitli kısıtlamalar ve detaylar) değiştirebilir. Diğer taraftan, sıradan bir kütüphanede tanımlanmış olağan bir işlevdir ve C (ve C++, bu konu için) böyle bir işlevin yerini alacak bir imkanı yoktur. Neredeyse her linker'i güneşin altında libc
sans malloc
'a bağlamak ve malloc
referanslarını başka bir kütüphane/nesne dosyasından kodlamak için ikna edebilirsiniz. Ancak, yalnızca bir tanımlı kuralı ihlal ettiği için farklı bir malloc
işlev tanımlayamazsınız: Programda "malloc" adlı iki işlevle sonuçlanırsınız, bu da her ikisi de standart tarafından yasaklanmıştır (static
için, anonim olmayanlar için) - namespace
, inline
, ... işlevleri) ve bağlayıcılar için ciddi bir sorun (büyük olasılıkla, bir hata veya iki tanımdan biri düşürülmüş).
Aynı nedenle, yalnızca bir işaretçiniz varsa, ancak bir nesnenin örneğiniz varsa tam bir ek içeriğe sahip olmanız gerektiğini bildirebilirsiniz. http://stackoverflow.com/questions/553682/when-can-i-use-a-forward-declaration?rq=1 – CoryKramer
Bağlantılı cevabın ifadesi '3 diyor. Yeni, malloc eşdeğerinin olmadığı bir new_handler kavramına sahiptir. IMHO bu% 100 doğru değil. Alttaki c kütüphanesinde, genellikle kendi uygulamalarınızla _overridden_ olabilecek birkaç zayıf sembol vardır (bkz. Ör. ['_sbrk'] (http://en.wikipedia.org/wiki/Sbrk)). Bildirilen zayıf semboller mutlaka linker_Knowdlege içermez. –