使用shared_ptr返回vector的指针

return a pointer of vector with shared_ptr

本文关键字:vector 指针 返回 ptr shared 使用      更新时间:2023-10-16

我正在使用向量的shared_ptr进行测试。目的很简单,我想返回一个向量的指针并访问其中的值。但它给出了例外。"内存位置..的..std:out_of_range处出现未处理的异常。"。我使用的是Visual Studio 2012。

vector<int>* func()
{
    boost::shared_ptr<vector<int> > vec(new vector<int>());
    vec->push_back(123);
    return vec.get();
    }
int _tmain(int argc, _TCHAR* argv[])
{
    vector<int>* result = func();
    cout << result->at(0); // ERROR here
    return 0;
}

如果要使用共享指针,则返回共享指针,而不是原始指针。否则,当shared_ptr超出范围时,它将破坏矢量。访问该向量将导致未定义的行为。

boost::shared_ptr<vector<int> > func()
{
    boost::shared_ptr<vector<int> > vec(new vector<int>());
    vec->push_back(123);
    return vec;
}

然而,请注意,按值返回向量要好得多:

vector<int> func()
{
    vector<int> vec;
    vec.push_back(123);
    return vec;
}

这样,就不会通过move构造函数或RVO进行复制。

func()返回的类型需要是boost::shared_ptr<vector<int>>,而不是vector<int>*

共享指针的全部意义在于,你可以随心所欲地传递它们,当它们都停止被引用时,它们指向的内存就会被回收。

当你离开函数时"忘记"了对共享指针的引用,它会自动回收当时分配的内存,留下一个指向无效内存位置的指针。

函数中的shared_ptr是唯一引用指向vector的指针的函数。当它超出作用域时(当函数返回时),它将删除被引用的指针。

使函数返回shared_ptr,而不是常规指针。

我建议你仔细阅读一下应该如何使用shared_ptr,因为你做得都错了。。这意味着不再需要处理原始指针,绝对不需要混合它们。基本上,您可以像过去使用原始指针一样传递shared_ptr实例,但不必再关心删除它。改为:

typedef std::vector< int > my_vector;
typedef boost::shared_ptr< my_vector > my_vector_ptr;
my_vector_ptr func()
{
  my_vector_ptr vec( boost::make_shared< my_vector >() );
  vec->push_back(123);
  return vec.get();
}
int _tmain(int argc, _TCHAR* argv[])
{
  my_vector_ptr result = func();
  cout << result->at(0);
  return 0;
}

使用反向插入器以避免混合插入和返回相同的向量。让客户端指定向量的开关类型。。。从而使功能模板成为可能。

代码:

typedef std::vector< int > my_vector;
typedef boost::shared_ptr< my_vector > my_vector_ptr;
template <typename OutputIterator>
void func1(OutputIterator it)
{
   // std::copy (anotherVector.begin(), anotherVector.end(), it);
   *it++ = 123; 
}
void func2(my_vector& v)
{
   v.push_back(123);
}
int main()
{
    my_vector_ptr vec( new my_vector() );
    func1(std::back_inserter(*vec)); // func is now an algorithm .. 
    func2(*vec);
}

func1中,函数的签名说明该函数的作用。你们不能从矢量中擦除,你们不能做任何其他事情,只做它所说的。插入

func1看作一个算法。