指针容器: boost::ptr_vector ptr_container
2013-09-08 16:21
423 查看
在你见过 Boost C++ 库的各种智能指针之后,应该能够编写安全的代码,来使用动态分配的对象和数组。多数时候,这些对象要存储在容器里——如上所述——使用 boost::shared_ptr 和 boost::shared_array 这就相当简单了。
上面例子中的代码当然是正确的,智能指针确实可以这样用,然而因为某些原因,实际情况中并不这么用。 第一,反复声明 boost::shared_ptr 需要更多的输入。 其次,将 boost::shared_ptr拷进,拷出,或者在容器内部做拷贝,需要频繁的增加或者减少内部引用计数,这肯定效率不高。 由于这些原因,Boost C++ 库提供了指针容器
专门用来管理动态分配的对象。
boost::ptr_vector 类的定义在 boost/ptr_container/ptr_vector.hpp里,它跟前一个例子中用 boost::shared_ptr 模板参数来初始化的容器具有相同的工作方式。 boost::ptr_vector 专门用于动态分配的对象,它使用起来更容易也更高效。 boost::ptr_vector 独占它所包含的对象,因而容器之外的共享指针不能共享所有权,这跟 std::vector<boost::shared_ptr<int> >
相反。
除了 boost::ptr_vector之外,专门用于管理动态分配对象的容器还包括:boost::ptr_deque, boost::ptr_list, boost::ptr_set, boost::ptr_map, boost::ptr_unordered_set 和 boost::ptr_unordered_map。这些容器等价于C++标准里提供的那些。最后两个容器对应于std::unordered_set和 std::unordered_map,它们作为技术报告1的一部分加入 C++ 标准。 如果所使用的
C++ 标准实现不支持技术报告1的话,还可以使用 Boost C++ 库里实现的 boost::unordered_set 和 boost::unordered_map。
view plaincopyprint?
// shared_ptr.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <boost/ptr_container/ptr_container.hpp>
#define _crtdbg_map_alloc
#include "stdlib.h"
#include "crtdbg.h"
class CMan
{
public:
CMan()
{
printf("construct/n");
}
~CMan()
{
printf("deconstruct/n");
}
protected:
private:
};
int _tmain(int argc, _TCHAR* argv[])
{
{
boost::ptr_vector<CMan> listMan;
CMan *p1 = new CMan();
listMan.push_back(p1);
//char * sz = new char[32];
}
_CrtDumpMemoryLeaks();
//system("pause");
return 0;
}
// shared_ptr.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <boost/ptr_container/ptr_container.hpp>
#define _crtdbg_map_alloc
#include "stdlib.h"
#include "crtdbg.h"
class CMan
{
public:
CMan()
{
printf("construct/n");
}
~CMan()
{
printf("deconstruct/n");
}
protected:
private:
};
int _tmain(int argc, _TCHAR* argv[])
{
{
boost::ptr_vector<CMan> listMan;
CMan *p1 = new CMan();
listMan.push_back(p1);
//char * sz = new char[32];
}
_CrtDumpMemoryLeaks();
//system("pause");
return 0;
}
很多野文都提到,放心使用boost的指针容器:容器在析构的时候,会自动清理指针。
那么有认真测试过内存泄漏的问题吗?自己动手来测试下吧。
我使用_CrtDumpMemoryLeaks简单的检测方法。
结果,对比代码中的new char,ptr_vector确实没有泄漏。
运行代码也会发现,容器析构的时候,其指针成员的析构也会执行。
这下我们可以方向使用boost指针容器了吧。
#include <boost/shared_ptr.hpp> #include <vector> int main() { std::vector<boost::shared_ptr<int> > v; v.push_back(boost::shared_ptr<int>(new int(1))); v.push_back(boost::shared_ptr<int>(new int(2))); }
上面例子中的代码当然是正确的,智能指针确实可以这样用,然而因为某些原因,实际情况中并不这么用。 第一,反复声明 boost::shared_ptr 需要更多的输入。 其次,将 boost::shared_ptr拷进,拷出,或者在容器内部做拷贝,需要频繁的增加或者减少内部引用计数,这肯定效率不高。 由于这些原因,Boost C++ 库提供了指针容器
专门用来管理动态分配的对象。
#include <boost/ptr_container/ptr_vector.hpp> int main() { boost::ptr_vector<int> v; v.push_back(new int(1)); v.push_back(new int(2)); }
boost::ptr_vector 类的定义在 boost/ptr_container/ptr_vector.hpp里,它跟前一个例子中用 boost::shared_ptr 模板参数来初始化的容器具有相同的工作方式。 boost::ptr_vector 专门用于动态分配的对象,它使用起来更容易也更高效。 boost::ptr_vector 独占它所包含的对象,因而容器之外的共享指针不能共享所有权,这跟 std::vector<boost::shared_ptr<int> >
相反。
除了 boost::ptr_vector之外,专门用于管理动态分配对象的容器还包括:boost::ptr_deque, boost::ptr_list, boost::ptr_set, boost::ptr_map, boost::ptr_unordered_set 和 boost::ptr_unordered_map。这些容器等价于C++标准里提供的那些。最后两个容器对应于std::unordered_set和 std::unordered_map,它们作为技术报告1的一部分加入 C++ 标准。 如果所使用的
C++ 标准实现不支持技术报告1的话,还可以使用 Boost C++ 库里实现的 boost::unordered_set 和 boost::unordered_map。
boost 指针容器ptr_container之内存泄漏
[cpp]view plaincopyprint?
// shared_ptr.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <boost/ptr_container/ptr_container.hpp>
#define _crtdbg_map_alloc
#include "stdlib.h"
#include "crtdbg.h"
class CMan
{
public:
CMan()
{
printf("construct/n");
}
~CMan()
{
printf("deconstruct/n");
}
protected:
private:
};
int _tmain(int argc, _TCHAR* argv[])
{
{
boost::ptr_vector<CMan> listMan;
CMan *p1 = new CMan();
listMan.push_back(p1);
//char * sz = new char[32];
}
_CrtDumpMemoryLeaks();
//system("pause");
return 0;
}
// shared_ptr.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <boost/ptr_container/ptr_container.hpp>
#define _crtdbg_map_alloc
#include "stdlib.h"
#include "crtdbg.h"
class CMan
{
public:
CMan()
{
printf("construct/n");
}
~CMan()
{
printf("deconstruct/n");
}
protected:
private:
};
int _tmain(int argc, _TCHAR* argv[])
{
{
boost::ptr_vector<CMan> listMan;
CMan *p1 = new CMan();
listMan.push_back(p1);
//char * sz = new char[32];
}
_CrtDumpMemoryLeaks();
//system("pause");
return 0;
}
很多野文都提到,放心使用boost的指针容器:容器在析构的时候,会自动清理指针。
那么有认真测试过内存泄漏的问题吗?自己动手来测试下吧。
我使用_CrtDumpMemoryLeaks简单的检测方法。
结果,对比代码中的new char,ptr_vector确实没有泄漏。
运行代码也会发现,容器析构的时候,其指针成员的析构也会执行。
这下我们可以方向使用boost指针容器了吧。
相关文章推荐
- boost 指针容器ptr_container之内存泄漏
- 多索引容器boost::multi_index_container储存共享智能指针boost::shared_ptr
- 指针容器的应用 --- boost::ptr_container介绍
- ptr_vector-一个指针的容器
- C++智能指针,指针容器原理及简单实现(auto_ptr,scoped_ptr,ptr_vector).
- C++智能指针,指针容器原理及简单实现(auto_ptr,scoped_ptr,ptr_vector).
- boost库的智能指针shared_ptr结合容器vector的使用
- 容器vector的resize操作 & 智能指针shared_ptr的reset操作
- Boost学习之指针容器--pointer_container
- C++ 指针操作vector容器
- Boost.Interprocess使用手册翻译之五:独立于映射地址的指针:offset_pt (Mapping Address Independent Pointer: offset_ptr)
- boost 智能指针 shared_ptr 原理分析
- STL容器中放入wchar_t*指针出错 Vector中放入wchar_t*
- 为什么auto_ptr智能指针不能作为STL标准容器的元素
- Boost智能指针——weak_ptr vs shared_ptr
- Boost智能指针——shared_ptr
- Boost智能指针——shared_ptr
- 容器 vector指针的学习
- Boost智能指针——shared_ptr
- [5]智能指针boost::scoped_ptr