【问题标题】:How to move to the next pointer in a smart pointer array如何移动到智能指针数组中的下一个指针
【发布时间】:2020-02-03 09:28:34
【问题描述】:

我一直试图弄清楚智能指针数组如何与测试程序一起工作,该测试程序旨在一次读取一个文件,并将每个字符存储在所述数组中的指针处。但是,为了设置数组的后续变量,我一直无法增加指针。虽然没有智能指针,但我可以简单地输入,例如,

char *check = new char[length];
for (int i =0; i < length; i++);{
    *check=='a';
    check++;
}

这将允许我为指针数组中的每个指针分配一个值,对智能指针数组执行相同操作会导致“check++”行出现以下错误,

//This is the smart pointer I've been using, for reference;
std::shared_ptr<char> right(new char(length));
error: no 'operator++(int)' declared for postfix '++' [-fpermissive]

暂时,让我们忘记括号表示法不存在(它有效,但我想知道用指针表示法做到这一点的方法),所以我可以以可靠的方式增加或访问未来的指针,这样我可以在诸如循环之类的事情中使用它来在智能指针数组的每个指针中输入值。

【问题讨论】:

  • 我认为您误解了 std::shared_ptr 的设计目的。如果您想遍历分配的缓冲区,例如 char 值,则应该使用 std::vector&lt;char&gt;(length)
  • char *check = new char[length]; 没有指针数组。只有一个(动态分配的)字符数组。你最好在循环内写check[i]='a';

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


【解决方案1】:

std::shared_ptr&lt;char&gt; 是指向 one 字符的指针。当共享指针被销毁时,它将在其指针上调用delete,而不是delete []

您可以使用std::shared_ptr&lt;char[]&gt;,然后您可以让该指针保存一个字符数组。

然而,这对于这项工作来说是错误的工具(除非您正在使用遗留代码或包装使用指向数组的原始指针的东西)。您要使用的是std::vector&lt;char&gt;,它是一个字符动态数组,所有内存管理都被抽象掉了。

这就是你在循环中使用它的方式,不确定为什么你不想使用括号符号,因为这是这里工作的工具。

#include <memory>
#include <iostream>

int main() {
    std::unique_ptr<char[]> ptr(new char[10]);

    for (int i=0; i<10; ++i)
        ptr[i]='a'+i;

    for (int i=0; i<10; ++i)
        std::cout << ptr[i] << ' ';
}

IMO 更好的选择是改用 std::vector&lt;char&gt; ptr(10);

【讨论】:

  • 这让我对这个问题有了新的看法,尤其是我在使用括号时出错了,但是有没有办法将变量分配给数组中的特定指针和 ptr 的输出用指针表示法?
  • @TobiasFizzlewig 您可以使用char* raw_ptr = ptr.get(); 从智能指针中获取原始指针。
【解决方案2】:

shared_ptr 不支持算术运算。 shared_ptr 的目的是管理它所拥有的指针的生命周期。

当您指向一个数组并使用[] 运算符时,您将索引到该数组中。

【讨论】:

  • 有没有办法使用指针表示法将输入输入到 shared_ptr 数组中?
  • @TobiasFizzlewig std::shared_ptr::get() 将允许您访问它存储的指针:en.cppreference.com/w/cpp/memory/shared_ptr/get。但是你必须小心不要产生悬空指针。
  • @TobiasFizzlewig 和这个 std::shared_ptr right(new char(length));没有做你想做的事。一个元素,其中存储了值长度。
猜你喜欢
  • 2016-10-09
  • 1970-01-01
  • 1970-01-01
  • 2012-09-06
  • 1970-01-01
  • 1970-01-01
  • 2015-03-30
  • 2017-04-29
  • 1970-01-01
相关资源
最近更新 更多