ホームページ >バックエンド開発 >C++ >関数呼び出しで一時 C オブジェクトのデストラクターが呼び出されるのはいつですか?

関数呼び出しで一時 C オブジェクトのデストラクターが呼び出されるのはいつですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-13 11:57:14207ブラウズ

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

C での一時オブジェクトの保証された有効期間

質問:

一時オブジェクトのデストラクターはいつ呼び出されますか?関数呼び出し内で作成されましたが、パラメータとして使用されていませんか?具体的には、次のコードを考えてみましょう:

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

答え:

一時 StringBuffer オブジェクトのデストラクターは、GetString の呼び出しで呼び出されます。

C 標準 (12.2 一時的) に準拠オブジェクト)、一時オブジェクトの存続期間は、(a) それ自体が別の完全式内でオペランド (クラス オブジェクトの構築を除く) として現れず、(b) である完全式の終了時に終了します。

コード例では、GetString の呼び出しは完全な式であり、一時的な StringBuffer オブジェクトがその式内に作成されます。したがって、一時オブジェクトの有効期間は、GetString への呼び出しが返された後に終了します。

この有効期間保証により、一時オブジェクトは不要になるまで有効なままになります。これにより、式が完全に評価されるまで一時オブジェクトが保持されるため、式テンプレートで一時オブジェクトへの参照を保持できるようになります。

以上が関数呼び出しで一時 C オブジェクトのデストラクターが呼び出されるのはいつですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。