[問題] unique_ptr 接 raw ptr argument

作者: lovesnake (LoyalDog)   2016-01-25 20:17:17
請問該如何把raw pointer 當argument丟給參數是unique_ptr的function呢?
實際情況約如下(太短就不貼其他地方了):
void TestUP (unique_ptr<int*> temp)
{
**temp = 100;
}
int main (void)
{
int a {10};
TestUP (make_unique<int*>(&a));
return 0;
}
上面這個結果Run得出來...
可是make_unique是14的東西,我要使用的環境只支援到11。
而且語意也很奇怪...
我要丟一個東西讓function修改,應該是丟指標就夠了,卻要丟掉指標的指標。
另外有嘗試過
unique_ptr<int>(&a)
可是在function裡面必須自己release,造成語意很奇怪。
請問有甚麼辦法解決呢?
謝謝~!
作者: Caesar08 (Caesar)   2016-01-25 20:28:00
http://ideone.com/v4RMMs我的意思是你根本傳錯參數,你的a是int而不是int*
作者: firose (guest也是也是也是也是也)   2016-01-25 22:19:00
TestUP(unique_ptr<int*>{new int*(&a)});
作者: Caesar08 (Caesar)   2016-01-26 11:01:00
請問你的輸出型參數是template嗎?還是你的輸出型參數是unique_ptr<int>or<int*>這種的?
作者: firose (guest也是也是也是也是也)   2016-01-26 11:20:00
那行是原本 make_unique 被 inline 的結果,兩者意義一樣
作者: BlazarArc (Midnight Sun)   2016-01-26 12:32:00
介面為何這樣設計? 有 unique_ptr 表示擁有權轉移吧?你說的那些code標準讓我覺得很奇怪...
作者: Caesar08 (Caesar)   2016-01-26 13:17:00
我也覺得很怪,而且你Func這樣寫,output根本不能用要output可以用,parameter要是std::unique_ptr<T> &然後既然又是output,那你外面就只要create一個std::unique_ptr<T> output; 也不用初始化output,就直接傳進Func就好了
作者: BlazarArc (Midnight Sun)   2016-01-26 14:07:00
會不會被改應該是看 parameter 有沒有 const 吧用這些奇怪rule不如用個正常的ide直接顯示signatureunique_ptr就是表示heap memory擁有權概念
作者: Caesar08 (Caesar)   2016-01-26 14:19:00
因為那是output,如果你傳一個temporary object給TestUP呼叫TestUP的人要怎麼得到這個output結果?而且unique_ptr只應該用來綁new出來的物件他的確可以綁你的local variable,但你這樣用就會需要呼叫release如果你的output function都長這樣,那你就得必須都在裡面呼叫release如果TestUP的parameter是& http://ideone.com/Hd8MjU這樣外部的人可以拿到output,TestUP也不需要release
作者: firose (guest也是也是也是也是也)   2016-01-26 14:58:00
如果不 RAII (因為去呼叫 release) 為何要用 unique_ptr ?
作者: Caesar08 (Caesar)   2016-01-26 16:45:00
既然有C++11支援,能用smart pointer就用,不行的話再用raw pointer一般來說,function不會去delete你的pointer,除非他本來就是拿來delete/release pointer我覺得你最大的問題,是當初那個function設計不良...
作者: BlazarArc (Midnight Sun)   2016-01-26 22:47:00
你說的就reference啊 不能用到底是哪招快逃吧(?
作者: Caesar08 (Caesar)   2016-01-26 22:57:00
你都能使用smart pointer,為甚麼不能使用reference?
作者: uranusjr (←這人是超級笨蛋)   2016-01-27 00:44:00
其實我覺得會修改就用 pointer 是個合理準則, 避免 rawpointers 也是, 但訂這個規範的人應該要能解答你的問題要嘛有合理解法否則就需要有例外, 而不是死抱教條不放
作者: ronin728 (浪人)   2016-01-27 01:54:00
new 出來的才需要特別關照。如果連這種被管理會自動釋放的指標,引用他的位置都不能用pointer還叫C++ programming? 其實是你曲解教義吧。
作者: bibo9901 (function(){})()   2016-01-27 14:10:00
你確定你了解 pointer / reference ?
作者: Caesar08 (Caesar)   2016-01-27 17:02:00
所以那些function,你只能用,而不能改,這樣對嗎?

Links booklink

Contact Us: admin [ a t ] ucptt.com