/Zc:throwingNew (Przyjmowanie nowych zgłoszeń operatora)

Po określeniu opcji /Zc:throwingNew kompilator optymalizuje wywołania w celu operator new pomijania sprawdzania zwracania wskaźnika o wartości null. Ta opcja informuje kompilator o założeniu, że wszystkie połączone implementacje operator new i niestandardowe alokatory są zgodne ze standardem C++ i zgłaszają błąd alokacji. Domyślnie w programie Visual Studio kompilator pesymistycznie generuje kontrole wartości null (/Zc:throwingNew-) dla tych wywołań, ponieważ użytkownicy mogą łączyć się z implementacją operator new niestandardową alokatora lub zapisywać niestandardowe procedury alokatora, które zwracają wskaźniki o wartości null.

Składnia

/Zc:throwingNew[-]

Uwagi

Ponieważ iso C++98, standard określił, że domyślny operator nowy zgłasza std::bad_alloc , gdy alokacja pamięci kończy się niepowodzeniem. Wersje programu Visual C++ do programu Visual Studio 6.0 zwróciły wskaźnik o wartości null w przypadku niepowodzenia alokacji. Począwszy od programu Visual Studio 2002, operator new jest zgodny ze standardem i zgłasza błąd. Aby obsługiwać kod korzystający ze starszego stylu alokacji, program Visual Studio zapewnia implementację z możliwością operator new łączenia w pliku nothrownew.obj, który zwraca wskaźnik o wartości null w przypadku błędu. Domyślnie kompilator generuje również defensywne kontrole wartości null, aby zapobiec wystąpieniu awarii w przypadku awarii w starszych stylach. / Zc:throwingNew opcja nakazuje kompilatorowi pozostawienie tych kontroli null, przy założeniu, że wszystkie połączone alokatory pamięci są zgodne ze standardem. Nie ma to zastosowania do jawnych przeciążeń nierzuconych operator new , które są deklarowane przy użyciu dodatkowego parametru typu std::nothrow_t i mają jawną noexcept specyfikację.

Koncepcyjnie, aby utworzyć obiekt w wolnym magazynie, kompilator generuje kod w celu przydzielenia pamięci, a następnie wywołania konstruktora w celu zainicjowania pamięci. Ponieważ kompilator MSVC zwykle nie może stwierdzić, czy ten kod zostanie połączony z niezgodnym, nierzucającym alokatorem, domyślnie generuje również sprawdzanie wartości null przed wywołaniem konstruktora. Zapobiega to wyłuszczeniu wskaźnika null w wywołaniu konstruktora, jeśli alokacja nie zgłasza błędu. W większości przypadków te kontrole są niepotrzebne, ponieważ domyślne operator new alokatory zgłaszają zamiast zwracać wskaźniki o wartości null. Kontrole mają również niefortunne skutki uboczne. Wdęają rozmiar kodu, zalewają predyktor gałęzi i hamują inne przydatne optymalizacje kompilatora, takie jak dewirtualizacja lub propagacja const z zainicjowanego obiektu. Kontrole istnieją tylko do obsługi kodu, który łączy się z nothrownew.obj lub ma niestandardowe implementacje niezgodne operator new . Jeśli nie używasz niezgodności operator new, zalecamy użycie polecenia /Zc:throwingNew w celu zoptymalizowania kodu.

Opcja /Zc:throwingNew jest domyślnie wyłączona i nie ma to wpływu na /permissive- opcji.

Jeśli kompilujesz przy użyciu generowania kodu czasu połączenia (LTCG), nie musisz określać /Zc:throwingNew. Gdy kod jest kompilowany przy użyciu ltCG, kompilator może wykryć, czy jest używana domyślna, zgodna implementacja operator new . Jeśli tak, kompilator automatycznie pomija sprawdzanie wartości null. Konsolidator szuka flagi /ThrowingNew , aby określić, czy implementacja jest zgodna operator new . Tę flagę można określić do konsolidatora, dołączając tę dyrektywę w źródle dla nowego operatora niestandardowego:

#pragma comment(linker, "/ThrowingNew")

Aby uzyskać więcej informacji na temat problemów ze zgodnością w programie Visual C++, zobacz Zachowanie niezgodne.

Aby ustawić tę opcję kompilatora w środowisku programowania Visual Studio

  1. Otwórz okno dialogowe Strony właściwości projektu. Aby uzyskać szczegółowe informacje, zobacz Set C++ compiler and build properties in Visual Studio (Ustawianie właściwości kompilatora języka C++ i kompilowania w programie Visual Studio).

  2. Z menu rozwijanego Konfiguracja wybierz pozycję Wszystkie konfiguracje.

  3. Wybierz stronę Właściwości>konfiguracji C/C++>Wiersza polecenia.

  4. Zmodyfikuj właściwość Opcje dodatkowe, aby uwzględnić /Zc:throwingNew lub /Zc:throwingNew- a następnie wybierz przycisk OK.

Zobacz też

Opcje kompilatora MSVC
Składnia wiersza polecenia kompilatora MSVC
/Zc (Zgodność)
noexcept (C++)
Specyfikacje wyjątków (throw) (C++)
terminate (wyjątek)