說,例如我有以下代碼(純示例):析構函數如何知道何時激活自己?它可以依賴嗎?
class a {
int * p;
public:
a() {
p = new int;
}
~a() {
delete p;
}
};
a * returnnew() {
a retval;
return(&retval);
}
int main() {
a * foo = returnnew();
return 0;
}
在returnnew(),將被RETVAL的函數的返回後(當RETVAL超出範圍)破壞?或者它會禁用自動銷燬後,我返回的地址,我可以說刪除foo;在main()的結尾?或者,以類似的方式(僞代碼):
void foo(void* arg) {
bar = (a*)arg;
//do stuff
exit_thread();
}
int main() {
while(true) {
a asdf;
create_thread(foo, (void*)&asdf);
}
return 0;
}
析構函數會去哪裏?我必須在哪裏說刪除?或者這是不確定的行爲?唯一可能的解決方案是使用STL引用計數的指針嗎?這將如何實施?
謝謝 - 我已經使用了C++一段時間,但從未完全處於這種情況,並且不想創建內存泄漏。
+1好的解釋 – 2010-04-08 01:36:51
還要注意的是,「按值返回」的功能會被任何像樣的編譯器優化,使其不產生任何不必要的副本,使得它在這種情況下,最好的選擇(和一般) 。 http://en.wikipedia.org/wiki/Return_value_optimization – 2010-04-08 01:55:30