作者descent (「雄辯是銀,沉默是金」)
看板C_and_CPP
標題[討論] 暫時物件的生命周期
時間Wed Dec 11 22:40:06 2013
#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
推 purpose:是,所以 operator char*() 應該要 new char[100] 來回傳 12/11 23:13
→ Feis:應該不要提供這種轉型 12/11 23:43
可以不要使用暫時物件, 使用具名物件就不會有這問題。
Mystring s3 = s1+s2;
const char *p = s3;
之前從來沒注意過暫時物件的生命周期。
這不像表面看來那麼簡單, c++ 標準委員會花了兩年才搞定這問題。
※ 編輯: descent 來自: 58.114.140.46 (12/12 19:04)
→ azureblaze:自動轉型很容易發生在暫時物件上 這樣寫很危險 12/12 22:13
→ azureblaze:至少加個explicit,確保用的人知道他在做什麼 12/12 22:16