Rumah >pembangunan bahagian belakang >C++ >Bilakah Pemusnah Objek C Sementara Dipanggil dalam Panggilan Fungsi?

Bilakah Pemusnah Objek C Sementara Dipanggil dalam Panggilan Fungsi?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-13 11:57:14196semak imbas

When is a Temporary C   Object's Destructor Called in a Function Call?

Dijamin Jangka Hayat Sementara dalam C

Soalan:

Bilakah pemusnah untuk objek sementara dipanggil apabila ia berada dibuat dalam panggilan fungsi tetapi tidak digunakan sebagai parameter? Khususnya, pertimbangkan kod berikut:

class StringBuffer
{
public:
    StringBuffer(std::string & str) : m_str(str)
    {
        m_buffer.push_back(0);
    }
    ~StringBuffer()
    {
        m_str = &m_buffer[0];
    }
    char * Size(int maxlength)
    {
        m_buffer.resize(maxlength + 1, 0);
        return &m_buffer[0];
    }
private:
    std::string & m_str;
    std::vector<char> m_buffer;
};

std::string mystring;
GetString(StringBuffer(mystring).Size(MAXLEN), MAXLEN);

Jawapan:

Pemusnah untuk objek StringBuffer sementara dipanggil selepas panggilan ke GetString kembali.

Menurut Piawaian C (12.2 Objek sementara), hayat objek sementara berakhir pada penghujung ungkapan penuh yang (a) tidak dengan sendirinya muncul sebagai operan (kecuali dalam pembinaan objek kelas) dalam ungkapan penuh yang lain, dan (b) bukan sebahagian daripada ungkapan dalam kurungan.

Dalam kod contoh, panggilan ke GetString ialah ungkapan penuh dan objek StringBuffer sementara dibuat dalam ungkapan itu. Oleh itu, jangka hayat objek sementara tamat selepas panggilan ke GetString kembali.

Jaminan seumur hidup ini memastikan objek sementara kekal sah sehingga ia tidak diperlukan lagi. Ia membenarkan templat ungkapan menyimpan rujukan kepada objek sementara kerana sementara akan bertahan sehingga ungkapan dinilai sepenuhnya.

Atas ialah kandungan terperinci Bilakah Pemusnah Objek C Sementara Dipanggil dalam Panggilan Fungsi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn