我可以在STL容器中使用MFC对象吗?

时间:2010-05-05 22:20:04

标签: c++ mfc memory-management

以下代码在MSVC2005中不能为我编译:

std::vector<CMenu> vec(10);

CMenu是MFC菜单对象(例如上下文菜单)。通过一些测试,我了解到CMenu没有公共拷贝构造函数。

要做我想做的事情,我需要使用动态数组。

CMenu* menus = new CMenu[10];
// ...
delete [] menus;

当然,现在我已经失去了使用STL容器的所有好处。

我还有其他选择吗?

3 个答案:

答案 0 :(得分:6)

您可以使用pointer containers或智能指针的容器,例如使用Boost或TR1中的shared_ptr

std::vector<shared_ptr<CMenu> > vec;
vec.push_back(make_shared<CMenu>());

答案 1 :(得分:1)

MFC对象是围绕Windows句柄的简单包装器,大多数设计用于释放析构函数中的句柄。因此,拥有一个复制构造函数是危险的,因为第一个被破坏会使另一个无效。

让您的容器代替句柄,并在每次需要转换回MFC-land时使用FromHandle。

答案 2 :(得分:0)

您可以将STL容器与智能指针结合使用,以存储指向堆分配对象的指针,这些对象在容器被销毁时自动delete

这项工作的正确智能指针是boost::shared_ptr

有关详情,请参阅this question