【问题标题】:C++ boost shared array swapping pointers (simple question)C++ 提升共享数组交换指针(简单问题)
【发布时间】:2009-11-18 18:10:09
【问题描述】:

我是提升共享数组的新手。

现有代码声明了两个数组:

boost::shared_array<unsigned char> src; 
boost::shared_array<unsigned char> dest; 

我要做的就是交换每个数组指向的内容(src 变成 dest,dest 变成 src)。据我了解, shared_array.get() 方法返回一个指向其元素之一的指针(可以是任何类型)。

所以我添加的声明是:

boost::shared_array<unsigned char> temp;

我添加的代码是:

temp.get() = src.get();
src.get() = dest.get();
dest.get() = temp.get();

每一行都失败了;编译错误是 C2016: '=' : left operand must be l-value.

我是 C++ 新手,所以我用 Google 搜索了错误,发现该错误消息意味着左侧操作数不可赋值。但是左边都是指针,指针可以赋值给其他指针。

所以我不确定我做错了什么。有人可以帮帮我吗?

提前致谢。

jbu

【问题讨论】:

    标签: c++ arrays boost pointers shared


    【解决方案1】:

    交换两个shared_arrays(或大多数其他Boost共享指针类型)的正确方法是使用swap成员函数:

    src.swap(dest);
    

    这会交换每个shared_arrays 使用的指针和引用计数:

    void swap(shared_array<T> & other)
    {
        std::swap(px, other.px);
        pn.swap(other.pn);
    }
    

    【讨论】:

    • 我对另一个建议 swap() 的人的评论:查看 swap(),它说它“交换了 src 和 dest 的内容”。这听起来就像它实际上是 memcpying 内存。我真的只想交换指针,而不是交换内容。
    • 我认为这可以解决问题。谢谢!也许只有我一个人,但是“交换内容”的评论有点令人困惑。
    • 这很令人困惑,但swap 函数通常被编写为尽可能高效,并且不会引发异常。
    • 你不能使用惯用的using std::swap; swap(src,dest); 并让ADL 选择正确的swap 版本吗?我会很惊讶Boost 库没有在类文件中提供独立版本...
    • 你也可以这样做;它调用src.swap(dest)
    【解决方案2】:

    对于您原来的问题:只需使用boost::shared_arrayswap() 方法即可。 (不要害怕,这不会 memcpy 任何东西。)

    get() 返回的指针在您的情况下不是左值,因为您想更改指针本身的值,而不是它指向的数据。所以你需要在这里引用指针。

    【讨论】:

      【解决方案3】:

      swap(src,dest) 应该可以解决问题。

      至于你做错了什么:src.get() 给你一个来自shared_array 对象的指针的副本,所以即使你可以分配给它,它也不会改变shared_array 本身。您可以将一个数组分配给另一个数组,如下所示:

      boost::shared_array<unsigned char> temp = src;
      src = dest;
      dest = temp;
      

      但是swap 效率更高,并且保证不会抛出异常。

      【讨论】:

      • 查看 swap(),它说它“交换了 src 和 dest 的内容”。这听起来就像它实际上是 memcpying 内存。我真的只想交换指针,而不是交换内容。
      • @jbu:它“交换两个智能指针的内容”(即交换指针和智能指针实现中的任何其他内容),但不会触及它们指向的内存。跨度>
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-10
      • 2012-10-19
      • 1970-01-01
      • 2012-09-27
      • 2010-11-17
      • 1970-01-01
      相关资源
      最近更新 更多