[问题] 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