【问题标题】:2 vector objects pointing to the same allocated memory2个向量对象指向同一个分配的内存
【发布时间】:2012-11-12 09:39:05
【问题描述】:

在 C++ 中,如何复制现有向量指向相同的分配内存?

例如:

vector<int> o1;
o1.push_back(1);

vector<int> o2;
//Make o2 share same memory as o1
o2[0]=2;

cout << o1[0]; //display 2

编辑:我还不清楚目标:如果 o1 在堆上分配并被销毁,我如何创建一个对象 o2 指向与 o1 相同的分配内存以将其保留在 o1 之外范围?

【问题讨论】:

  • 你不能。没有办法使建议的解决方案起作用。目前未公开的问题可能有解决方案,但需要明确要求。
  • 您可以将o2 设为参考:vector&lt;int&gt;&amp; o2(o1);
  • 使用 shared_ptr > 或 boost::shared_array 尽管使用 boost::shared_array 你不能调整你的数组大小。

标签: c++ vector copy


【解决方案1】:

使o2成为o1的引用

std::vector<int> &o2 = o1;

【讨论】:

  • 这不会产生“两个矢量对象”。
  • 同意,这个问题不是 100% 清楚的。我不得不猜测一个指针或引用是他的意思。
  • 是的,它确实适用于我给出的简化示例。但是如果第一个对象 o1 被销毁但我想保留它为 o2 分配的内存怎么办?
  • 这需要动态分配,不是吗?我的问题是 o1 是在堆上分配的
  • 如果 o1 在堆上,为什么不能?
【解决方案2】:

有一个boost::shared_array 模板。

然而,这共享一个固定大小的数据数组,您无法修改大小。

如果您想共享可调整大小的矢量,请使用

boost::shared_ptr&lt; vector&lt; int &gt; &gt;

您还可以做的是将向量内存swap 转换为不同的向量。

{
   std::vector< int > o1; // on the stack
     // fill o1
   std::vector< int > * o2 = new std::vector< int >; // on the heap
   o2->swap( o1 );
    // save o2 somewhere or return it
} // o2 now owns the exact memory that o1 had as o1 loses scope

C++11 将引入“移动”语义,从而使您可以使用std::move 将实际内存保留在 o1 中

std::vector<int> && foo()
{
      std::vector<int> o1;
       // fill o1
      return std::move( o1 );
}


// from somewhere else
std::vector< int > o2( foo() );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-28
    • 2023-02-07
    • 1970-01-01
    • 1970-01-01
    • 2012-08-22
    • 1970-01-01
    • 2017-01-20
    • 2017-12-06
    相关资源
    最近更新 更多