Maison >développement back-end >C++ >Quand le destructeur d'un objet C temporaire est-il appelé dans un appel de fonction ?

Quand le destructeur d'un objet C temporaire est-il appelé dans un appel de fonction ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-13 11:57:14216parcourir

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

Durée de vie garantie des objets temporaires en C

Question :

Quand le destructeur d'un objet temporaire est-il appelé lorsqu'il est créé dans un appel de fonction mais non utilisé comme paramètre ? Plus précisément, considérons le code suivant :

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);

Réponse :

Le destructeur de l'objet StringBuffer temporaire est appelé après l'appel à GetString renvoie.

Selon la norme C (12.2 Objets temporaires), la durée de vie d'un objet temporaire se termine à la fin de l'expression complète qui (a) n'apparaît pas elle-même comme un opérande (sauf dans la construction d'un objet de classe) dans une autre expression complète, et (b) ne fait pas partie d'une expression entre parenthèses.

Dans l'exemple de code, l'appel à GetString est l'expression complète et l'objet StringBuffer temporaire est créé dans cette expression. Par conséquent, la durée de vie de l'objet temporaire se termine après le retour de l'appel à GetString.

Cette garantie à vie garantit que l'objet temporaire reste valide jusqu'à ce qu'il ne soit plus nécessaire. Il permet aux modèles d'expression de contenir des références à des objets temporaires, car les temporaires dureront jusqu'à ce que l'expression soit complètement évaluée.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn