2016-05-06 2 views
1

私は、C++のデストラクタに関して多少の具体的な質問があります。私がコードで尋ねていることを説明するのははるかに簡単です。 「棒()」から返されたオブジェクト内の動的メモリには、この例では、ポインタのポイントをC++関数引数の一時変数のデストラクタの動作が標準ですか?

foo(bar().ptr); 

:基本的に私はこれまで(ただし、厳密に)似た何かをしたいです。ポインタはシンプルさからchar *であると仮定できます。私は、 'ptr'が 'foo()'の実行中に生きることを指していることを確かめたい。今すぐコード内で意味する内容を完成させるために:

foo(char* ptr) 
{ 
    // do stuff with *ptr 
} 

obj bar() 
{ 
    obj thing; 

    return thing; 
} 

struct obj 
{ 
    char* ptr; 

    obj() 
    { 
     ptr = new char[1]; 
    } 

    ~obj() 
    { 
     delete[] ptr; 
    } 
}; 

これは完全に最適化されていないVisual Studioで動作します。私は妄想的で、これに100%信頼したいと思っています。このコードはLinuxでも実行する必要があります(gccでコンパイル)。厳密にはx86。

これはやや微妙なので、この動作が標準であるかどうかを確認するよう求めていたと思いました。コンパイラのように見えるでしょうこれが確実に動作するようにします。

ありがとうございます!

答えて

4

はい、保証があります。一時的な表現は式の終わりまで生きます。これはあなたのケースで関数foo()が返されるまでです。

概念的には、あなたのケースは

void x(const char*); 

x(std::string("String").c_str()); 

と違いはありませんそして、これは由緒ある練習です!

あなたのスマートポインタクラスは非常にひどく書かれていますが、実際のコードではなく説明のためだけです。

+0

ハッハッハ、c_ptr()!はい、上記のコードはすべて、最も関連性の高い部分だけに蒸留されています。ありがとう! – Tom

+0

あなたのサイドノートへのサイドノート:サンプルスマートポインタクラスはあまりにもひどく書かれているので、この使い方は分かりません。一時的なもの(RVOなし)は、一時的なものが使用される前に破壊されている関数のローカルから構成されている間違ったコピーです。 –

関連する問題