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
Libérer: 2024-12-13 11:57:14
original
189 Les gens l'ont consulté

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);
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal