Share via


<new> işleçler ve sabit listeleri

enum align_val_t

enum class align_val_t : size_t {};

operator delete

Tek tek nesneler için depolamayı serbest bırakmak için bir delete ifade tarafından çağrılan işlev.

void operator delete(void* ptr) noexcept;
void operator delete(void *, void*) noexcept;
void operator delete(void* ptr, const std::nothrow_t&) noexcept;

Parametreler

ptr
Değeri silme işlemiyle geçersiz olarak işlenecek olan işaretçi.

Açıklamalar

İlk işlev, geçersiz değerini işlemek için bir delete ifade tarafından çağrılır ptr . Program, C++ Standart Kitaplığı tarafından tanımlanan varsayılan sürümün yerini alan bu işlev imzasıyla bir işlev tanımlayabilir. Gerekli davranış, önceki bir çağrısı tarafından döndürülen veya değerini ptrnullptr kabul etmektir operator new.

içindeki ptr bir nullptr değerin varsayılan davranışı hiçbir şey yapmamaktır. diğer herhangi bir değeri ptr , daha önce açıklandığı gibi bir çağrı tarafından daha önce döndürülen bir new değer olmalıdır. null olmayan bir değeri ptr için varsayılan davranış, önceki çağrı tarafından ayrılan depolama alanını geri kazanmaktır. Bu tür geri kazanılmış depolamanın bir parçasının veya tamamının, sonraki bir çağrısı operator newveya herhangi callocbir , mallocrealloc veya işlevi tarafından hangi koşullar altında ayrıldığı belirtilmez.

İkinci işlev, formunun new( std::size_t )ifadesine karşılık gelen bir new yerleştirme delete ifadesi tarafından çağrılır. Hiçbir şey yapmaz.

Üçüncü işlev, formunun new( std::size_t, const std::nothrow_t& )ifadesine karşılık gelen bir new yerleştirme delete ifadesi tarafından çağrılır. Program, C++ Standart Kitaplığı tarafından tanımlanan varsayılan sürümün yerini alan bu işlev imzasıyla bir işlev tanımlayabilir. Gerekli davranış, önceki bir çağrısı tarafından döndürülen veya değerini ptrnullptr kabul etmektir operator new. Varsayılan davranış, değerini değerlendirmektir delete( ptr ).

Örnek

kullanan operator deletebir örnek için bkzoperator new. .

operator delete[]

Bir nesne dizisi için depolamayı serbest bırakmak için bir ifade tarafından delete çağrılan işlev.

void operator delete[](void* ptr) noexcept;
void operator delete[](void *, void*) noexcept;
void operator delete[](void* ptr, const std::nothrow_t&) noexcept;

Parametreler

ptr
Değeri silme işlemiyle geçersiz olarak işlenecek olan işaretçi.

Açıklamalar

İlk işlev, geçersiz değerini işlemek için bir delete[] ifade tarafından çağrılır ptr . Program bu işlev imzası ile C++ Standart Kitaplığı tarafından tanımlanan varsayılan sürümün yerini alan bir işlev tanımlayabildiği için işlev değiştirilebilir. Gerekli davranış, önceki bir çağrısı tarafından döndürülen veya değerini ptrnullptr kabul etmektir operator new[]. null değeri ptr için varsayılan davranış hiçbir şey yapmamaktır. diğer herhangi bir değeri ptr , daha önce açıklandığı gibi bir çağrı tarafından daha önce döndürülen bir değer olmalıdır. böyle bir null olmayan değeri ptr için varsayılan davranış, önceki çağrı tarafından ayrılan depolamayı geri kazanmaktır. Bu tür geri kazanılmış depolamanın bir parçasının veya tamamının, sonraki bir çağrısı operator newveya herhangi callocbir , mallocrealloc veya işlevi tarafından hangi koşullar altında ayrıldığı belirtilmez.

İkinci işlev, formunun new[]( std::size_t )ifadesine karşılık gelen bir new[] yerleştirme delete[] ifadesi tarafından çağrılır. Hiçbir şey yapmaz.

Üçüncü işlev, formunun new[]( std::size_t, const std::nothrow_t& )ifadesine karşılık gelen bir new[] yerleştirme delete[] ifadesi tarafından çağrılır. Program, C++ Standart Kitaplığı tarafından tanımlanan varsayılan sürümün yerini alan bu işlev imzasıyla bir işlev tanımlayabilir. Gerekli davranış, işlecine ptrnullptrnew[]yapılan önceki bir çağrı tarafından döndürülen veya değerini kabul etmektir. Varsayılan davranış, değerini değerlendirmektir delete[]( ptr ).

Örnek

kullanımına operator delete[]ilişkin örnekler için bkzoperator new[]. .

operator new

Tek tek nesneler için depolama ayırmak için new-expression tarafından çağrılan işlev.

void* operator new(std::size_t count);
void* operator new(std::size_t count, const std::nothrow_t&) noexcept;
void* operator new(std::size_t count, void* ptr) noexcept;

Parametreler

count
Ayrılacak depolama bayt sayısı.

ptr
Döndürülecek işaretçi.

Dönüş değeri

Yeni ayrılan depolama alanının en düşük bayt adresinin işaretçisi. veya ptrişlevinin üçüncü biçimini kullanıyorsanız.

Açıklamalar

İlk işlev, bu boyuttaki herhangi bir nesneyi temsil etmek üzere uygun şekilde hizalanmış depolama baytlarını ayırmak count için bir new ifade tarafından çağrılır. Bu işlev değiştirilebilir. Bu, programın bu işlev imzası ile C++ Standart Kitaplığı tarafından tanımlanan varsayılan sürümün yerini alan alternatif bir işlev tanımlayabileceği anlamına gelir.

Gerekli davranış, yalnızca depolama istendiği gibi ayrılabiliyorsa null olmayan bir işaretçi döndürmektir. Bu tür ayırmaların her biri, ayrılan diğer depolama alanından ayrı depolamaya yönelik bir işaretçi verir. Ardışık çağrılar tarafından ayrılan depolamanın sırası ve bitişikliği belirtilmemiştir. İlk depolanan değer belirtilmemiş. Döndürülen işaretçi, ayrılan depolama alanının başlangıcını (en düşük bayt adresi) gösterir. Sıfır ise count , döndürülen değer işlevi tarafından döndürülen diğer değerlerle eşit değildir.

Varsayılan davranış bir döngü yürütmektir. döngü içinde işlev ilk olarak istenen depolamayı ayırmayı dener. Denemenin çağrısı malloc gerekip gerekmediği belirtilmemiştir. Ayırma girişimi başarılı olursa, işlev ayrılan depolamaya bir işaretçi döndürür. Aksi takdirde, işlev türündeki new_handlerbelirlenmiş işlevi çağırır. Çağrılan işlev döndürürse döngü yineler. İstenen depolamayı ayırma girişimi başarılı olduğunda veya çağrılan bir işlev geri dönmediğinde döngü sonlandırılır.

Türünde new_handler bir işlevin gerekli davranışı aşağıdaki işlemlerden birini gerçekleştirmektir:

  • Daha fazla depolama alanını ayırma için kullanılabilir hale getirin ve geri dönün.

  • abort veya exitöğesini arayın.

  • türünde bad_allocbir nesne atın.

bir işlevin new_handler varsayılan davranışı türünde bad_allocbir nesne oluşturmaktır. Varsayılan nullptr işlevi bir değer belirlir new_handler .

ardışık çağrılar operator new tarafından ayrılan depolamanın sırası ve bitişikliği, burada depolanan ilk değerler gibi belirtilmez.

İlk biçimi tarafından ayrılan depolama alanını boşaltmak operator newiçin öğesini çağırın operator delete.

İkinci işlev, bu boyuttaki herhangi bir nesneyi temsil etmek üzere uygun şekilde hizalanmış depolama baytlarını ayırmak count için bir yerleştirme new ifadesi tarafından çağrılır. Bu işlev değiştirilebilir. Bu, programın bu işlev imzası ile C++ Standart Kitaplığı tarafından tanımlanan varsayılan sürümün yerini alan alternatif bir işlev tanımlayabileceği anlamına gelir.

Varsayılan davranış, bu işlevin başarılı olması durumunda döndürülmesidir operator new( count ) . Aksi takdirde döndürür nullptr.

İkinci biçimi (yani döndürmediysenullptr) tarafından ayrılan depolama alanını operator new boşaltmak için öğesini çağırınoperator delete.

Üçüncü işlev, formunun new ( ptr ) Tayırmayan yerleştirme new ifadesi tarafından çağrılır. Burada, ptr tek bir nesne işaretçisi oluşur. Bilinen bir adreste nesne oluşturmak için yararlı olabilir. işlevi döndürür ptr. Bu nesnede yıkıcıyı açıkça çağırmanız gerekir.

Ayırmayan yerleştirmeyi newçağırırsanız, çağrısı deleteyapmayın. Bunun yerine, nesne için yıkıcıyı çağırdıktan sonra, sağladığınız bellek için deallocator'ı çağırın.

oluşturma veya oluşturmama davranışı newhakkında bilgi için bkznew. ve delete işleçleri.

Örnek

// new_op_new.cpp
// compile with: /EHsc
#include<new>
#include<iostream>

using namespace std;

class MyClass {
    int member{ 0 };
public:
    MyClass() {
        cout << "MyClass at 0x" << this << " constructed.\n";
    };

    ~MyClass() {
        cout << "MyClass at 0x" << this << " destroyed.\n";
    };
};

int main( )
{
    // The first form of new / delete
    MyClass* fPtr1 = new MyClass;
    delete fPtr1;

    // The second form (fail returns nullptr) of new / delete
    MyClass* fPtr2 = new(nothrow) MyClass[2];
    if (fPtr2)
        delete fPtr2;

    // The third form (non-allocating placement) of new / delete
    char x[sizeof(MyClass)]; // x is automatic
    MyClass* fPtr3 = new(&x[0]) MyClass;
    fPtr3->~MyClass(); // Requires explicit destructor call
    // no delete because x is on the stack
}

operator new[]

Bir nesne dizisi için depolama ayırmak için yeni bir ifade tarafından çağrılan ayırma işlevi.

void* operator new[](std::size_t count);
void* operator new[](std::size_t count, const std::nothrow_t&) noexcept;
void* operator new[](std::size_t count, void* ptr) noexcept;

Parametreler

count
Dizi nesnesi için ayrılacak depolama bayt sayısı.

ptr
Döndürülecek işaretçi.

Dönüş değeri

Yeni ayrılan depolama alanının en düşük bayt adresinin işaretçisi. Veya ptrüçüncü form kullanıldığında.

Açıklamalar

İlk işlev, bu boyutta veya daha küçük herhangi bir dizi nesnesini temsil etmek üzere uygun şekilde hizalanmış depolama baytlarını ayırmak count için bir new[] ifade tarafından çağrılır. Program, C++ Standart Kitaplığı tarafından tanımlanan varsayılan sürümün yerini alan bu işlev imzasıyla bir işlev tanımlayabilir. Gerekli davranış ile operator newaynıdır. Varsayılan davranış, başarılı olursa geri dönmektir operator new( count ) . Aksi takdirde, bir std::bad_alloc özel durum (veya 'den std::bad_alloctüretilen bir özel durum) oluşturur. Bu biçimiyle ayrılan depolama alanını boşaltmak operator new[]için öğesini çağırın operator delete[].

İkinci işlev, bu boyuttaki herhangi bir dizi nesnesini temsil etmek üzere uygun şekilde hizalanmış depolama baytlarını ayırmak count için bir yerleştirme new[] ifadesi tarafından çağrılır. Program, C++ Standart Kitaplığı tarafından tanımlanan varsayılan sürümün yerini alan bu işlev imzasıyla bir işlev tanımlayabilir. Varsayılan davranış, bu işlevin başarılı olması durumunda döndürülmesidir operator new( count ) . Aksi takdirde döndürür nullptr. Bu biçimiyle ayrılan depolama alanını boşaltmak operator new[]için öğesini çağırın operator delete[]. oluşturma veya oluşturmama davranışı newhakkında daha fazla bilgi için bkznew. ve delete işleçleri.

Üçüncü işlev, formunun new( ptr ) T[ N ]ayırmayan yerleştirme new[] ifadesi tarafından çağrılır. Bu form bellek ayırmaz. parametresi aracılığıyla ptr geçirilen bellekteki nesneleri oluşturur. işlevi döndürür ptr. Oluşturulan her nesne için yıkıcıyı açıkça çağırmanız gerekir. için yeterli bellek sağlamak sizin sorumluluğundadır ptr. İfade tarafından döndürülen değerde new çağırmayındelete[]. Bunun yerine, ptrgerekirse, yıkıcıları çağırdıktan sonra serbest bırakabilirsiniz.

Örnek

// new_op_array.cpp
// compile with: /EHsc
#include <new>
#include <iostream>

using namespace std;

class MyClass {
    int member{ 0 };
public:
    MyClass() {
        cout << "MyClass at 0x" << this << " constructed.\n";
    };

    ~MyClass() {
        cout << "MyClass at 0x" << this << " destroyed.\n";
    };
};

int main() {
    // The first form of array new / delete
    MyClass* fPtr1 = new MyClass[2];
    delete[] fPtr1;

    // The second form (fail returns nullptr) of array new / delete
    MyClass* fPtr2 = new(nothrow) MyClass[2];
    if (fPtr2)
        delete[] fPtr2;

    // The third form (non-allocating placement) of array new / delete
    char x[2 * sizeof(MyClass) + sizeof(int)]; // x is automatic

    MyClass* fPtr3 = new(&x[0]) MyClass[2];
    fPtr3[1].~MyClass(); // Requires explicit destructor calls
    fPtr3[0].~MyClass(); // Recommended in reverse construction order
    // Don't delete[] fPtr3 here.
    // delete[] &x[0] not required because x is on the stack
}