【问题标题】:Why does std::unique_ptr has a "get()" member function? [duplicate]为什么 std::unique_ptr 有一个“get()”成员函数? [复制]
【发布时间】:2014-10-30 22:40:03
【问题描述】:

std::unique_ptr不是设计成一个指向内存的唯一指针,其他指针不应该指向这个内存吗?

那么为什么std:unique_ptr 有一个get() 成员函数,它返回一个指向std::unique_ptr 拥有的内存的原始指针?

所以通过使用get(),我们可以为std::unique_ptr 的内存创建大量所有者(原始指针),这不是没有意义吗?

【问题讨论】:

  • 不是原始指针是所有者。如果你说它是,它只是一个所有者。
  • 他们完全控制了他们指向的内存,为什么他们不被视为所有者?
  • 只要您将指向已分配内存的指针放入std::unique_ptr(在正确的范围内),您就可以在知道它的整个范围内安全地使用原始指针(通过get() 获得)将在适当的时候被删除。
  • @Galik 在超出范围之前不能有人做delete ptr.get() 吗?
  • @0x499602D2 有人可以这样做。 C++ 允许人们以多种方式做他们不应该做的事情,那么为什么这种特别的愚蠢应该是“不可能的”。正如我在回答中所解释的,如果没有 get 函数,有些事情你根本做不到。

标签: c++ pointers smart-pointers


【解决方案1】:

想象你会这样做:

void process_file()
{
   const int max_size = 10000; 
   std::unique_ptr<char[]> buffer(new char[max_size]); 

   ifstream f("myfile.txt"); 

   f.read(buffer.get(), max_size); 
   ... 
   ... process buffer
   ...
}

如果没有get(),你会怎么做? unique_ptr 不能按原样传递给 istream::read

好吧,正如评论所说,您可以通过使用&amp;*buffer 来做到这一点,但这远非易事——使用buffer.get() 向读者清楚地表明“这是缓冲区内的原始指针。

【讨论】:

  • "如果没有 get(),你会怎么做?" &amp;*buffer
  • 没错。更好的答案是拥有get 可以让您清楚地表明您正在从唯一指针中提取裸指针,而不是要求人们从&amp;* 或cmets 中找出它。
猜你喜欢
  • 1970-01-01
  • 2020-01-31
  • 2012-06-03
  • 1970-01-01
  • 2017-10-18
  • 1970-01-01
  • 2013-01-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多