使用shared_ptr返回vector的指针
return a pointer of vector with shared_ptr
我正在使用向量的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
看作一个算法。
- std::vector::迭代器是否可以合法地作为指针
- 为什么 vector 的随机访问迭代器给出与指针不同的内存地址?
- 如何将唯一指针的 std::vector 转换为原始指针的 std::span?
- 我无法使用C++指针指向类方法返回的 std::vector
- 在自定义 std::vector-like 容器中处理指针和非指针模板类型的最佳方法是什么?
- 指向基类的指针的 std::vector 的深层副本
- 从 std::vector 迭代器中执行函数指针
- 将 std::vector::d ata 传递给函数期望类型**(双指针)
- 根据指针条件初始化std::vector
- 释放 std::vector 中指针内存的最有效方法是什么?
- 在实现 std::vector 时,我必须拥有 end() 的"end"指针吗?
- 将双指针作为参数传递给需要引用 std::vector <double>的函数
- 如何将 std::string 赋回作为 <char>void* 指针传递的 std::vector.data()?
- 将此类的智能指针追加到成员 std::vector
- 为什么 std::vector<>::const_reference 可以转换为非常量指针?
- SWIG:传递一个 std::vector< std::vector <double> >指向 python 的指针
- 带有 std::vector 的指针算术
- 从vector<指针*>vector<指针*比;在c++中
- 如何获取指向原始数据的std::vector指针
- c++的vector指针,vector的声明和指针的删除