Bagikan melalui


<new> operator dan enum

enum align_val_t

enum class align_val_t : size_t {};

operator delete

Fungsi yang dipanggil oleh ekspresi untuk membatalkan alokasi delete penyimpanan untuk objek individual.

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

Parameter

ptr
Penunjuk yang nilainya akan dirender tidak valid oleh penghapusan.

Keterangan

Fungsi pertama dipanggil oleh delete ekspresi untuk merender nilai yang ptr tidak valid. Program dapat menentukan fungsi dengan tanda tangan fungsi ini yang menggantikan versi default yang ditentukan oleh Pustaka Standar C++. Perilaku yang diperlukan adalah menerima nilai ptr itu nullptr atau yang dikembalikan oleh panggilan sebelumnya ke operator new.

Perilaku default untuk nullptr nilai adalah ptr tidak melakukan apa-apa. Nilai lain harus ptr berupa nilai yang dikembalikan sebelumnya oleh panggilan seperti yang new dijelaskan sebelumnya. Perilaku default untuk nilai ptr non-null adalah mengklaim kembali penyimpanan yang dialokasikan oleh panggilan sebelumnya. Ini tidak ditentukan dalam kondisi apa bagian atau semua penyimpanan yang diklaim kembali tersebut dialokasikan oleh panggilan berikutnya ke operator new, atau ke salah callocsatu fungsi , , mallocatau realloc .

Fungsi kedua dipanggil oleh ekspresi penempatan delete yang new sesuai dengan ekspresi formulir new( std::size_t ). Ini tidak melakukan apa-apa.

Fungsi ketiga dipanggil oleh ekspresi penempatan delete yang new sesuai dengan ekspresi formulir new( std::size_t, const std::nothrow_t& ). Program dapat menentukan fungsi dengan tanda tangan fungsi ini yang menggantikan versi default yang ditentukan oleh Pustaka Standar C++. Perilaku yang diperlukan adalah menerima nilai ptr yaitu nullptr atau yang dikembalikan oleh panggilan sebelumnya ke operator new. Perilaku defaultnya adalah mengevaluasi delete( ptr ).

Contoh

Lihat operator new contoh yang menggunakan operator delete.

operator delete[]

Fungsi yang delete dipanggil oleh ekspresi untuk membatalkan alokasi penyimpanan untuk array objek.

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

Parameter

ptr
Penunjuk yang nilainya akan dirender tidak valid oleh penghapusan.

Keterangan

Fungsi pertama dipanggil oleh delete[] ekspresi untuk merender nilai yang ptr tidak valid. Fungsi dapat diganti karena program dapat menentukan fungsi dengan tanda tangan fungsi ini yang menggantikan versi default yang ditentukan oleh Pustaka Standar C++. Perilaku yang diperlukan adalah menerima nilai ptr yaitu nullptr atau yang dikembalikan oleh panggilan sebelumnya ke operator new[]. Perilaku default untuk nilai ptr null adalah tidak melakukan apa-apa. Nilai lain harus ptr berupa nilai yang dikembalikan sebelumnya oleh panggilan seperti yang dijelaskan sebelumnya. Perilaku default untuk nilai non-null seperti ptr itu adalah mengklaim kembali penyimpanan yang dialokasikan oleh panggilan sebelumnya. Ini tidak ditentukan dalam kondisi apa bagian atau semua penyimpanan yang diklaim kembali tersebut dialokasikan oleh panggilan berikutnya ke operator new, atau ke salah callocsatu fungsi , , mallocatau realloc .

Fungsi kedua dipanggil oleh ekspresi penempatan delete[] yang new[] sesuai dengan ekspresi formulir new[]( std::size_t ). Ini tidak melakukan apa-apa.

Fungsi ketiga dipanggil oleh ekspresi penempatan delete[] yang new[] sesuai dengan ekspresi formulir new[]( std::size_t, const std::nothrow_t& ). Program dapat menentukan fungsi dengan tanda tangan fungsi ini yang menggantikan versi default yang ditentukan oleh Pustaka Standar C++. Perilaku yang diperlukan adalah menerima nilai ptr yaitu nullptr atau yang dikembalikan oleh panggilan sebelumnya ke operator new[]. Perilaku defaultnya adalah mengevaluasi delete[]( ptr ).

Contoh

Lihat operator new[] contoh penggunaan operator delete[].

operator new

Fungsi yang dipanggil oleh ekspresi baru untuk mengalokasikan penyimpanan untuk objek individual.

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;

Parameter

count
Jumlah byte penyimpanan yang akan dialokasikan.

ptr
Penunjuk yang akan dikembalikan.

Nilai hasil

Penunjuk ke alamat byte terendah dari penyimpanan yang baru dialokasikan. Atau ptr, jika menggunakan bentuk ketiga fungsi.

Keterangan

Fungsi pertama dipanggil oleh new ekspresi untuk mengalokasikan count byte penyimpanan yang cocok diselaraskan untuk mewakili objek apa pun dari ukuran tersebut. Fungsi ini dapat diganti. Ini berarti program dapat menentukan fungsi alternatif dengan tanda tangan fungsi ini yang menggantikan versi default yang ditentukan oleh Pustaka Standar C++.

Perilaku yang diperlukan adalah mengembalikan pointer non-null hanya jika penyimpanan dapat dialokasikan seperti yang diminta. Setiap alokasi tersebut menghasilkan pointer ke penyimpanan yang putus-putus dari penyimpanan lain yang dialokasikan. Urutan dan kesesuaian penyimpanan yang dialokasikan oleh panggilan berturut-turut tidak ditentukan. Nilai awal yang disimpan tidak ditentukan. Pointer yang dikembalikan menunjuk ke awal (alamat byte terendah) dari penyimpanan yang dialokasikan. Jika count nol, nilai yang dikembalikan tidak dibandingkan dengan nilai lain yang dikembalikan oleh fungsi.

Perilaku defaultnya adalah menjalankan perulangan. Dalam perulangan, fungsi pertama-tama mencoba mengalokasikan penyimpanan yang diminta. Apakah upaya melibatkan panggilan ke malloc tidak ditentukan. Jika upaya alokasi berhasil, fungsi mengembalikan penunjuk ke penyimpanan yang dialokasikan. Jika tidak, fungsi memanggil fungsi jenis yang ditunjuk new_handler. Jika fungsi yang dipanggil kembali, perulangan akan diulang. Perulangan berakhir ketika upaya untuk mengalokasikan penyimpanan yang diminta berhasil atau ketika fungsi yang disebut tidak kembali.

Perilaku yang diperlukan dari fungsi jenis new_handler adalah melakukan salah satu operasi berikut:

  • Buat lebih banyak penyimpanan tersedia untuk alokasi lalu kembalikan.

  • Panggil atau abort exit.

  • Lempar objek jenis bad_alloc.

Perilaku default fungsi new_handler adalah melemparkan objek jenis bad_alloc. Nilai nullptr menunjuk fungsi default new_handler .

Urutan dan kesesuaian penyimpanan yang dialokasikan oleh panggilan berturut-turut operator new tidak ditentukan, seperti halnya nilai awal yang disimpan di sana.

Untuk membebaskan penyimpanan yang dialokasikan oleh bentuk pertama , operator newpanggil operator delete.

Fungsi kedua dipanggil oleh ekspresi penempatan new untuk mengalokasikan count byte penyimpanan yang cocok diselaraskan untuk mewakili objek apa pun dengan ukuran tersebut. Fungsi ini dapat diganti. Ini berarti program dapat menentukan fungsi alternatif dengan tanda tangan fungsi ini yang menggantikan versi default yang ditentukan oleh Pustaka Standar C++.

Perilaku default adalah mengembalikan operator new( count ) jika fungsi tersebut berhasil. Jika tidak, ia kembali nullptr.

Untuk membebaskan penyimpanan yang dialokasikan oleh bentuk operator new kedua (yaitu, jika tidak mengembalikan nullptr), panggil operator delete.

Fungsi ketiga dipanggil oleh ekspresi penempatan new non-alokasi, dari formulir new ( ptr ) T. Di sini, ptr terdiri dari penunjuk objek tunggal. Ini dapat berguna untuk membuat objek di alamat yang diketahui. Fungsi mengembalikan ptr. Anda harus memanggil destructor secara eksplisit pada objek ini.

Jika Anda memanggil penempatan newnon-alokasi, jangan panggil delete. Sebagai gantinya, panggil deallocator untuk memori yang Anda berikan, jika perlu, setelah Anda memanggil destruktor untuk objek.

Untuk informasi tentang perilaku pelemparan atau non-pelemparan new, lihat Operator newdan delete .

Contoh

// 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[]

Fungsi alokasi yang dipanggil oleh ekspresi baru untuk mengalokasikan penyimpanan untuk array objek.

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;

Parameter

count
Jumlah byte penyimpanan yang akan dialokasikan untuk objek array.

ptr
Penunjuk yang akan dikembalikan.

Nilai hasil

Penunjuk ke alamat byte terendah dari penyimpanan yang baru dialokasikan. Atau ptr, saat formulir ketiga digunakan.

Keterangan

Fungsi pertama dipanggil oleh new[] ekspresi untuk mengalokasikan count byte penyimpanan yang cocok diselaraskan untuk mewakili objek array dengan ukuran tersebut atau lebih kecil. Program dapat menentukan fungsi dengan tanda tangan fungsi ini yang menggantikan versi default yang ditentukan oleh Pustaka Standar C++. Perilaku yang diperlukan sama dengan untuk operator new. Perilaku default adalah mengembalikan operator new( count ) jika berhasil. Jika tidak, itu melemparkan std::bad_alloc pengecualian (atau pengecualian yang berasal dari std::bad_alloc). Untuk membebaskan penyimpanan yang dialokasikan oleh bentuk ini, operator new[]panggil operator delete[].

Fungsi kedua dipanggil oleh ekspresi penempatan new[] untuk mengalokasikan count byte penyimpanan yang cocok diselaraskan untuk mewakili objek array dengan ukuran tersebut. Program dapat menentukan fungsi dengan tanda tangan fungsi ini yang menggantikan versi default yang ditentukan oleh Pustaka Standar C++. Perilaku default adalah mengembalikan operator new( count ) jika fungsi tersebut berhasil. Jika tidak, ia kembali nullptr. Untuk membebaskan penyimpanan yang dialokasikan oleh bentuk ini, operator new[]panggil operator delete[]. Untuk informasi selengkapnya tentang perilaku pelemparan atau non-pelemparan new, lihat Operator newdan delete .

Fungsi ketiga dipanggil oleh ekspresi penempatan new[] non-alokasi, dari formulir new( ptr ) T[ N ]. Formulir ini tidak mengalokasikan memori. Ini membangun objek dalam memori yang diteruskan melalui ptr parameter . Fungsi mengembalikan ptr. Anda harus memanggil destructor secara eksplisit untuk setiap objek yang dibuat. Anda bertanggung jawab untuk menyediakan memori yang cukup untuk ptr. Jangan panggil delete[] pada nilai yang dikembalikan oleh new ekspresi. Sebagai gantinya, batalkan alokasi ptr, jika perlu, setelah Anda memanggil destruktor.

Contoh

// 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
}