Home > 2006-01 / 実装技術 > This Entry [com : 0][Tb : 0]
文字列の連結("abc"と"de"をつなげて"abcde"を作る)の段階で一時オブジェクトが生成されており、s はその一時オブジェクトと生死を共にする配列の先頭要素を指しています。そして、puts を呼び出す時点では、一時オブジェクトは既に解体されていますから、s の値は無効になっているわけです。しかし、std::string str("abc");
const char* s;
s = (str + "de").c_str();
std::puts(s);
とすることは可能です。puts の呼び出しが完了するまで、一時オブジェクトは解体されないからです。std::puts((str + "de").c_str());
のように、明示的にブロックを作って生存期間をコントロールしようとします。しかし、for 文の式などでアトミックなインクリメントを実現しようとすると、このようなやり方ではいったん関数にせざるを得なくなります。ところが、一時オブジェクトの生存期間の性質を知っていれば、次のような書き方が可能になります。{
lock x;
++global_variable;
}
アトミックに処理させようとする式の直前に lock(), を書くだけで、簡単に排他制御を行うことができるのです。コンマ演算子の各オペランドの評価直後は副作用完了点にはなりますが、完結式の終わりではないので、この時点では一時オブジェクトは解体されません。副作用完了点と完結式の最後は混同しやすい概念であるため、注意が必要です。for (volatile int* p = &gloval_variable; /* 条件 */; lock(), ++*p)
{
/* 処理 */
}
http://cppemb.blog17.fc2.com/tb.php/47-83d2c602
Comment