[討論] 暫時物件的生命周期
看板C_and_CPP (C/C++)作者descent (「雄辯是銀,沉默是金」)時間12年前 (2013/12/11 22:40)推噓1(1推 0噓 3→)留言4則, 3人參與討論串1/3 (看更多)
#include <string>
#include <cstdio>
using namespace std;
class Mystring
{
public:
friend Mystring operator+(const Mystring&, const Mystring&);
Mystring(const char *s)
{
sprintf(str_, "%s", s);
}
~Mystring()
{
printf("~Mystring: %s\n", str_);
str_[0]='1';
str_[1]=0x0;
}
operator const char*()
{
return str_;
}
private:
char str_[100];
};
Mystring operator+(const Mystring &s1, const Mystring &s2)
{
char str[100];
sprintf(str,"%s%s", s1.str_, s2.str_);
return Mystring(str);
}
int main(int argc, char *argv[])
{
Mystring s1("123"), s2("abc");
const char *p = s1+s2;
printf("p: %s\n", p);
return 0;
}
s1+s2 產生的暫時物件在 const char *p = s1+s2; 就會解構了,
所以 printf("%s\n", p); 不會有預期的結果 (123abc)
是這樣解釋的嗎?
執行結果:
descent@debian-vm:tmp$ ./a.out
~Mystring: 123abc
p: 1
~Mystring: abc
~Mystring: 123
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 58.114.140.230
推
12/11 23:13, , 1F
12/11 23:13, 1F
→
12/11 23:43, , 2F
12/11 23:43, 2F
可以不要使用暫時物件, 使用具名物件就不會有這問題。
Mystring s3 = s1+s2;
const char *p = s3;
之前從來沒注意過暫時物件的生命周期。
這不像表面看來那麼簡單, c++ 標準委員會花了兩年才搞定這問題。
※ 編輯: descent 來自: 58.114.140.46 (12/12 19:04)
→
12/12 22:13, , 3F
12/12 22:13, 3F
→
12/12 22:16, , 4F
12/12 22:16, 4F
討論串 (同標題文章)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章