/Zc:throwingNew (Yeni işlecinin oluşturacağını varsay)

/Zc:throwingNew seçeneği belirtildiğinde, derleyici null işaretçi döndürme denetimlerini atlamak için çağrısı iyileştiriroperator new. Bu seçenek derleyiciye ve özel ayırıcılarının tüm bağlı uygulamalarının operator new C++ standardına uygun olduğunu varsaymasını ve ayırma hatası oluşturmasını söyler. Varsayılan olarak Visual Studio'da, derleyici bu çağrılar için kötümser bir şekilde null denetimleri (/Zc:throwingNew-) oluşturur çünkü kullanıcılar null işaretçiler döndüren özel ayırıcı yordamlarını oluşturmayan operator new bir uygulamayla bağlantı oluşturabilir veya yazabilir.

Sözdizimi

/Zc:throwingNew[-]

Açıklamalar

ISO C++98 sürümünden bu yana standart, bellek ayırma başarısız olduğunda yeni varsayılan işlecin atıldığınıstd::bad_alloc belirtmiştir. Visual Studio 6.0'a kadar olan Visual C++ sürümleri ayırma hatasında null işaretçi döndürdü. Visual Studio 2002'de başlayarak, operator new standarda uygundur ve hataya neden olur. Visual Studio, eski ayırma stilini kullanan kodu desteklemek için nothrownew.obj içinde hatayla ilgili null işaretçi döndüren bağlanabilir bir uygulaması operator new sağlar. Varsayılan olarak, derleyici bu eski stil ayırıcıların hatada anında kilitlenmeye neden olmasını önlemek için savunma null denetimleri de oluşturur. /Zc:throwingNew seçeneği, derleyiciye tüm bağlı bellek ayırıcılarının standarda uygun olduğu varsayımı üzerine bu null denetimleri bırakmasını söyler. Bu, türü std::nothrow_t ek bir parametre kullanılarak bildirilen ve açık noexcept belirtimleri olan açık oluşturma operator new olmayan aşırı yüklemeler için geçerli değildir.

Kavramsal olarak, serbest depoda bir nesne oluşturmak için derleyici, belleğini ayırmak ve sonra belleği başlatmak için oluşturucusunu çağırmak için kod oluşturur. MSVC derleyicisi normalde bu kodun uyumlu olmayan, atanmayan bir ayırıcıya bağlanıp bağlanamayacağını anlayamayacağından, oluşturucuyu çağırmadan önce varsayılan olarak null bir denetim de oluşturur. Bu, oluşturmayan ayırma başarısız olursa oluşturucu çağrısında null işaretçi başvuruyu önler. Çoğu durumda bu denetimler gereksizdir çünkü varsayılan operator new ayırıcılar null işaretçiler döndürmek yerine atar. Denetimlerin talihsiz yan etkileri de vardır. Kod boyutunu şişirir, dal tahmincisini doldurup devirtualizasyon veya başlatılan nesnenin dışına yayılma gibi diğer yararlı derleyici iyileştirmelerini engellerler. Denetimler yalnızca nothrownew.obj'ye bağlanan veya özel uyumsuz operator new uygulamaları olan kodu desteklemek için vardır. Uyumsuz operator newkullanmıyorsanız kodunuzu iyileştirmek için /Zc:throwingNew kullanmanızı öneririz.

/Zc:throwingNew seçeneği varsayılan olarak kapalıdır ve /permissive- seçeneğinden etkilenmez.

Bağlantı zamanı kod oluşturma (LTCG) kullanarak derlerseniz /Zc:throwingNew belirtmeniz gerekmez. Kodunuz LTCG kullanılarak derlendiğinde, derleyici varsayılan, uyumlu operator new uygulamanın kullanılıp kullanılmadığı algılayabilir. Bu durumda, derleyici null denetimlerini otomatik olarak bırakır. Bağlayıcı, uygulamasının uygun olup olmadığını söylemek için /ThrowingNew bayrağını operator new arar. Bu bayrağı bağlayıcıya belirtmek için bu yönergeyi özel işleç yeni uygulamanız için kaynağa ekleyebilirsiniz:

#pragma comment(linker, "/ThrowingNew")

Visual C++'daki uyumluluk sorunları hakkında daha fazla bilgi için bkz . Standart Dışı Davranış.

Bu derleyici seçeneğini Visual Studio geliştirme ortamında ayarlamak için

  1. Projenin Özellik Sayfaları iletişim kutusunu açın. Ayrıntılar için bkz . Visual Studio'da C++ derleyicisi ve derleme özelliklerini ayarlama.

  2. Yapılandırma açılan menüsünden Tüm Yapılandırmalar'ı seçin.

  3. Yapılandırma Özellikleri>C/C++>Komut Satırı özellik sayfasını seçin.

  4. Ek Seçenekler özelliğini /Zc:throwingNew veya /Zc:throwingNew- içerecek şekilde değiştirin ve tamam'ı seçin.

Ayrıca bkz.

MSVC Derleyicisi Seçenekleri
MSVC Derleyicisi Komut Satırı Söz Dizimi
/Zc (Uyumluluk)
noexcept (C++)
Özel Durum Belirtimleri (throw) (C++)
terminate (özel durum)