<new>
işlevleri
get_new_handler
new_handler get_new_handler() noexcept;
Açıklamalar
Geçerli new_handler
değerini döndürür.
Aklamak
template <class T>
constexpr T* launder(T* ptr) noexcept;
Parametreler
ptr
Türü T'ye benzeyen bir nesneyi tutan bellekteki bayt adresi.
Dönüş Değeri
X'e işaret eden T* türünde bir değer.
Açıklamalar
İşaretçi iyileştirme engeli olarak da adlandırılır.
Bağımsız değişkeninin değeri sabit ifadede kullanılabildiğinde sabit ifade olarak kullanılır. Bir bayt depolamaya, başka bir nesnenin kapladığı depolama alanı içinde benzer işaretçiye sahip bir nesneyse, nesneyi işaret eden bir işaretçi değeri aracılığıyla ulaşılabilir.
Örnek
struct X { const int n; };
X *p = new X{3};
const int a = p->n;
new (p) X{5}; // p does not point to new object because X::n is const
const int b = p->n; // undefined behavior
const int c = std::launder(p)->n; // OK
nothrow
ve delete
sürümleri new
için nothrow
bağımsız değişken olarak kullanılacak bir nesne sağlar.
extern const std::nothrow_t nothrow;
Açıklamalar
nesnesi, std::nothrow_t parametre türüyle eşleşmesi için işlev bağımsız değişkeni olarak kullanılır.
Örnek
İşlev parametresi olarak nasıl std::nothrow_t
kullanıldığına ilişkin örnekler için bkzoperator new
. veoperator new[]
.
set_new_handler
Yeni işleci bellek ayırma girişiminde başarısız olduğunda çağrılacak bir kullanıcı işlevi yükler.
new_handler set_new_handler(new_handler Pnew) throw();
Parametreler
Pnew
new_handler
yüklenecek.
Dönüş Değeri
İlk aramada 0 ve sonraki aramalarda önceki new_handler
.
Açıklamalar
İşlev, koruduğu statik new
işleyici işaretçisinde depolar Pnew
ve daha önce işaretçide depolanan değeri döndürür. İşleyici new
tarafından operator new
kullanılır.
Örnek
// new_set_new_handler.cpp
// compile with: /EHsc
#include<new>
#include<iostream>
using namespace std;
void __cdecl newhandler( )
{
cout << "The new_handler is called:" << endl;
throw bad_alloc( );
return;
}
int main( )
{
set_new_handler (newhandler);
try
{
while ( 1 )
{
new int[5000000];
cout << "Allocating 5000000 ints." << endl;
}
}
catch ( exception e )
{
cout << e.what( ) << endl;
}
}
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
The new_handler is called:
bad allocation