The _ITERATOR_DEBUG_LEVEL macro controls whether checked iterators and debug iterator support are enabled. This macro supersedes and combines the functionality of the older _SECURE_SCL and _HAS_ITERATOR_DEBUGGING macros.

Macro Values

The following table summarizes the possible values for the _ITERATOR_DEBUG_LEVEL macro.

Compilation mode Macro value Description
0 Disables checked iterators and disables iterator debugging.
1 Enables checked iterators and disables iterator debugging.
2 (Default) Enables iterator debugging; checked iterators are not relevant.
0 (Default) Disables checked iterators.
1 Enables checked iterators; iterator debugging is not relevant.

In release mode, the compiler generates an error if you specify _ITERATOR_DEBUG_LEVEL as 2.


The _ITERATOR_DEBUG_LEVEL macro controls whether checked iterators are enabled, and in Debug mode, whether debug iterator support is enabled. If _ITERATOR_DEBUG_LEVEL is defined as 1 or 2, checked iterators ensure that the bounds of your containers are not overwritten. If _ITERATOR_DEBUG_LEVEL is 0, iterators are not checked. When _ITERATOR_DEBUG_LEVEL is defined as 1, any unsafe iterator use causes a runtime error and the program is terminated. When _ITERATOR_DEBUG_LEVEL is defined as 2, unsafe iterator use causes an assert and a runtime error dialog that lets you break into the debugger.

Because the _ITERATOR_DEBUG_LEVEL macro supports similar functionality to the _SECURE_SCL and _HAS_ITERATOR_DEBUGGING macros, you may be uncertain which macro and macro value to use in a particular situation. To prevent confusion, we recommend that you use only the _ITERATOR_DEBUG_LEVEL macro. This table describes the equivalent _ITERATOR_DEBUG_LEVEL macro value to use for various values of _SECURE_SCL and _HAS_ITERATOR_DEBUGGING in existing code.

0 (Release default) 0 (disabled) 0 (disabled)
1 1 (enabled) 0 (disabled)
2 (Debug default) (not relevant) 1 (enabled in Debug mode)

For information on how to disable warnings about checked iterators, see _SCL_SECURE_NO_WARNINGS.


To specify a value for the _ITERATOR_DEBUG_LEVEL macro, use a /D compiler option to define it on the command line, or use #define before the C++ Standard Library headers are included in your source files. For example, on the command line, to compile sample.cpp in debug mode and to use debug iterator support, you can specify the _ITERATOR_DEBUG_LEVEL macro definition:

cl /EHsc /Zi /MDd /D_ITERATOR_DEBUG_LEVEL=1 sample.cpp

In a source file, specify the macro before any standard library headers that define iterators.

// sample.cpp


#include <vector>

// ...

See also

Checked Iterators
Debug Iterator Support
Safe Libraries: C++ Standard Library