【问题标题】:What's wrong to reset std::unique_ptr to pointer to array?将 std::unique_ptr 重置为指向数组的指针有什么问题?
【发布时间】:2019-01-22 03:02:42
【问题描述】:

我看到一些代码 sn-p 如下所示:

std::unique_ptr<uint8_t> mCache;
mCache.reset(new uint8_t[size]);

有人告诉我这段代码有一些问题。 谁能给我一些细节?

【问题讨论】:

标签: c++ c++11 smart-pointers unique-ptr


【解决方案1】:

给定std::unique_ptr&lt;uint8_t&gt; mCache;,当mCache 被销毁时,它的deleter 将使用delete 来销毁被管理的指针(如果有的话),即为单个对象释放内存。但是在mCache.reset(new uint8_t[size]); 之后mCache 管理的是一个指向数组的指针,这意味着它应该使用delete[];使用delete 为数组释放内存会导致UB。

代码可以改成

std::unique_ptr<uint8_t[]> mCache; // mCache is supposed to manage pointer to array
mCache.reset(new uint8_t[size]);   // safe now

【讨论】:

  • 另一个问题,我们需要销毁mCache吗?像 mCache.reset()。
  • @jiych.guru 没有。std::unique_ptr 的析构函数将为您完成这项工作。
  • 嗨,这些天我看到了std::unique_ptr&lt;char&gt; dirname(strdup(dirName.c_str()));。在我看来这是不对的。因为strdup的内存应该是free才能销毁而不是删除。那正确吗?谢谢。
  • @jiych.guru 是的。你认为是正确的。我们可以为它提供一个用户定义的删除器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-28
  • 1970-01-01
  • 1970-01-01
  • 2011-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多