如何使用std :: shared_ptr作为double数组?另外使用shared_ptr的优点/缺点是什么?std :: shared_ptr的用法
5
A
回答
9
这取决于你在做什么。如果你只是想双打的可变数组,去
std::vector<double>
例子:
std::vector<double> v;
v.push_back(23.0);
std::cout << v[0];
如果共享所述阵列事项的所有权转让给你,例如使用
std::shared_ptr<std::vector<double>>
实施例:
std::shared_ptr<std::vector<double>> v1(new std::vector<double>);
v1->push_back(23.0);
std::shared_ptr<std::vector<double>> v2 = v1;
v2->push_back(9.0);
std::cout << (*v1)[1];
可替换地,加速具有
boost::shared_array
其用于类似的目的。在这里看到:
http://www.boost.org/libs/smart_ptr/shared_array.htm
至于一些优势/的shared_ptr去的缺点:
优点
- 自动共享的基于引用计数的资源释放 - 有助于避免内存泄漏和其他与应用程序未被取消分配相关的问题
- 可以更容易地编写异常安全代码
缺点
- 内存开销来存储引用计数的小物件
- 性能可以比原始指针糟糕的是显著(但衡量这个)
6
你也可以提供array deleter:
template class ArrayDeleter {
public:
void operator() (T* d) const
{ delete [] d; }
};
int main()
{
std::shared_ptr array (new double [256], ArrayDeleter());
}
+1
你也可以使用lambda,我想:'std :: shared_ptr
相关问题
- 1. std :: enable_if和std :: shared_ptr
- 2. 安全std :: tr1 :: shared_ptr的用法
- 3. C++ 0x std :: shared_ptr与boost :: shared_ptr
- 4. 使用Qt中std :: shared_ptr的
- 5. QCache和std :: shared_ptr的
- 6. std :: shared_ptr与std容器
- 7. C++ std :: vector <std :: shared_ptr>
- 8. 如何处理不断发展的C++ std :: namespace?例如:std :: tr1 :: shared_ptr vs. std :: shared_ptr vs. boost :: shared_ptr vs. boost :: tr1 :: shared_ptr
- 9. 无法使用std :: shared_ptr作为std :: map中的值类型?
- 10. 正确使用std :: shared_ptr和std :: auto_ptr
- 11. 使用Boost Python&std :: shared_ptr
- 12. 使用std :: queue与shared_ptr?
- 13. C++中的空std :: shared_ptr与空std :: shared_ptr有什么区别?
- 14. std :: shared_ptr迭代器
- 15. 的std :: shared_ptr的双回调
- 16. 的std :: shared_ptr的Deletor类型
- 17. C++中std :: unique_ptr和std :: shared_ptr的区别
- 18. QSharedPointer VS std :: tr1 :: shared_ptr VS boost :: tr1 :: shared_ptr
- 19. 将std :: shared_ptr <char>转换为std :: shared_ptr <unsigned char>
- 20. 如何解决boost :: shared_ptr和使用std :: shared_ptr之间的冲突?
- 21. Qt应用程序和std :: shared_ptr的
- 22. 内存管理与std :: list和std :: shared_ptr
- 23. Doxygen可以识别std :: shared_ptr或std :: map
- 24. C++ 11:将std :: is_pointer扩展到std :: shared_ptr
- 25. 如何使用的std ::绑定的std :: shared_ptr的
- 26. 错误2664 - 无法从std :: vector <...>转换为std :: tr1 :: shared_ptr
- 27. 使用std :: shared_ptr检测循环引用
- 28. 我如何使用box2d使用std :: shared_ptr?
- 29. 将其转换为std :: shared_ptr
- 30. 从std :: shared_ptr窃取位
不要使用'的std :: shared_ptr'为一个动态分配的数组,它不会调用正确的'delete'。你可能想'std :: vector'。 –
birryree
2012-03-26 16:52:20
@birryree:从技术上讲,如果共享所有权语义对您很重要,您可以使用std :: shared_ptr>。或Boost的shared_array。看到这个问题,例如:http://stackoverflow.com/questions/6796655/why-use-one-vs-the-other-boostshared-array-vs-boostshared-ptrstdvecto –
2012-03-26 16:56:03
@StuartGolodetz - 关于所有权语义的好点。 piyush314必须知道'shared_array'是一个Boost构造(不是标准的),如果他确实想要一个原始分配的数组,他可以使用'std :: default_delete'作为指针删除器的参数,如下所示: 'std :: shared_ptr name(new double [size],std :: default_delete ());'。 –
birryree
2012-03-26 16:59:26