2014-07-01 22 views
7

Bağlantılı soruya bakın.Neden malloc() değiştiriliyor linker hakkında bilgi gerektirir, ancak :: operator new() yapmıyor mu?

Difference between global operator new and malloc

kabul cevap devletler,

"Değiştirme malloc solucanlar bir kutu açılır. Bağlayıcının bilgi gerektirir, çünkü portably yapılır, fakat edilebilir."

Neden malloc'un değiştirilmesi bağlayıcı hakkında bilgi gerektiriyor ve neden değiştiriliyor?

+0

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

+0

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. –

cevap

7

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 libcsans 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üş).

İlgili konular