【问题标题】:SmartPointers and pointer to array智能指针和指向数组的指针
【发布时间】:2014-07-30 22:45:41
【问题描述】:

美好的一天!关于智能指针的小问题。一般来说,我有指向 BYTE 数组的指针,我想使用 std::shared_ptr 而不是普通指针。这是我的指针示例

shared_ptr<BYTE> pointer(new BYTE[100]);
LPBYTE *old_pointer = pointer;

当然这是无效的例子,但我如何将我的智能指针分配给其他通用指针?

【问题讨论】:

  • 为什么不用矢量?
  • 对不起,我不问矢量或其他容器。这不是真正的程序示例。我只是想了解 shared_ptr 的用法。 LPBYTE = 指向 BYTE 的长指针 = unsigned char far
  • 为什么要将智能指针的内容分配给原始指针而不是另一个shared_ptr?不过使用std::shared_ptr::get()
  • 不可能有[]see here的shared_ptr
  • 我认为shared_ptr&lt; std::array&lt;BYTE, 100&gt; &gt; 可以

标签: c++ arrays pointers c++11


【解决方案1】:

你可能要求

std::shared_ptr<std::array<BYTE,100>> pointer(make_shared<std::array<BYTE,100>>());
LPBYTE old_pointer = pointer.get()->data();

要获得另一个参考,您可以简单地使用这样的语句

// increases reference count
std::shared_ptr<std::array<BYTE,100>> pointer2 = pointer;

请在此处查看详细文档:std::shared_ptr constructorstd::shared_ptr::get()

尽管记住:
使用std::shared_ptr::get() 访问智能指针的指针会绕过使用std::shared_ptr 提供的语义和功能。非常不鼓励这样做,除非您非常清楚自己在使用 old_pointer 做什么,以及它是否仍在范围内。

【讨论】:

  • 您应该补充一点,OP 不应该这样做,因为它违背了共享指针的目的。
  • 是的,但据我所知 get() 方法不会增加引用计数器,对吧?
  • @user922871 不,但如果你想这样做,那么为什么要尝试获取指向它的原始指针?
  • 其实我并没有尝试获取原始指针,我只是想了解 shared_ptr 的用法。那么,如果我想增加引用计数器,那么我必须将我的指针分配给另一个具有相同类型的 shared_ptr 吗?否则不会增加RC?
【解决方案2】:

您可以使用 get_pointer(shared_ptr) 访问原始指针

BYTE* raw_pointer = get_pointer(指针);

正如其他人指出的那样,抓取原始指针意味着您现在有一个未计算在内的引用,如果不小心就会出现潜在的危险情况。

此外,如果您使用 shared_ptr 来保存指向原始数组的指针,则需要在原始指针上调用 delete[] 而不是 delete。这意味着您将需要一个自定义删除器。我意识到您的示例可能是说明性的,而不是文字的,但仍然认为值得指出这一点。

【讨论】:

    【解决方案3】:

    boost::shared_ptr 的最新版本可以保存动态分配的数组。该功能正在添加到Library Fundamentals TS(标准化过程的一部分)。

    【讨论】:

      猜你喜欢
      • 2016-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-06
      • 1970-01-01
      • 2014-03-04
      相关资源
      最近更新 更多