创建指向列表中对象的指针映射
Create a map of pointers to objects in a list?
在试图修补附带项目中的内存泄漏等问题时,我完全混淆了指针、列表、映射和内存等。
我想创建一个在整个程序生命周期中使用的对象列表。但我也想使用一个映射来快速访问列表中的各个对象,通过它们的唯一id。我想我可以有一个指向列表中对象的指针映射来减少内存大小。
这可能吗?
我一直在研究测试代码,看起来像:
list<cObject> mylist;
map<int, ciEntity*> mymap;
void main(void)
{
int x = 0;
class cObject *temp;
for(x = 0; x < 10; x++)
{
temp = new cObject;
temp->name = new char[25];
strcpy(temp->name, "Test");
temp->id=x;
mylist.push_back(*temp);
// now what with the map?
delete temp;
}
}
我也有其他想法,把地图申报搞得一团糟。我尝试过使用iter来浏览列表,然后使用mymap[id]=iter或类似的变体。我什么事都干不了。我知道我的基本功在记忆力方面没有达到应有的水平。感谢您的帮助!
我会稍微修改一下,并在列表和地图中使用类似std::shared_ptr<cObject>
的东西。对于映射,可以使用int
或可能的std::string
作为键类型,然后使用std::shared_ptr<cObject>
作为值类型
所以你的代码看起来更像:
using namespace std;
list<shared_ptr<cObject> > mylist;
map<int, shared_ptr<cObject> > mymap;
void main(void)
{
int x = 0;
for(x = 0; x < 10; x++)
{
std::shared_ptr<cObject> temp = shared_ptr(new cObject);
temp->name = new char[25];
strcpy(temp->name, "Test");
temp->id=x;
mylist.push_back(temp);
// now what with the map?
mymap[x] = temp;
//no need to delete temp since it's a managed pointer-type
}
}
如果由于某种原因,您的编译器没有std::shared_ptr
,您也可以从boost获得它。
这种方法的好处是,您的列表和地图现在指向同一个对象,因此如果您更改列表中的对象,这些更改也将反映在地图中。此外,shared_ptr
对象将通过引用计数来管理指针的寿命,因此一旦不再引用指针,它将在指针上调用delete
,而不必担心清理每个容器中的指针(同时避免指针的所有权问题)。
您不需要列表和映射。映射以与列表相同的方式支持迭代,因此您可以通过键快速访问映射中的值,也可以通过迭代缓慢地访问。我还怀疑为什么要使用new来创建东西——char数组可能应该是std::字符串,对象本身可能应该是值。
相关文章:
- 如何创建对象函数指针C++映射?
- c++:复制、删除和运算符=在原始指针映射中
- 尝试通过指针映射访问类成员
- 使用函数指针映射时的 C++ 调用函数
- 将新元素推送到函数指针映射中 "inline" ?
- 如何在C 11中创建指针映射以静态成员功能
- 方法指针映射,编译器说他们不接受任何参数
- 从指针映射调用函数,指向具有可变数量参数的函数
- 如何使用boost::与函数指针映射正确绑定
- std::按值或指针映射操作
- 将函数指针映射到 std::string
- 指向指针向量的指针映射的错误
- 使用C++中的函数指针映射枚举键和值
- 创建指向成员函数的指针映射
- 无法从指向多态类的指针映射获取有效的指针
- C++ - 通过 getter 函数在单独的类中从对象指针映射访问成员函数
- 指向成员函数的指针映射:无法将 void (*) 转换为 void (对象::*)
- std::基类指针映射
- 为对象指针映射编写函数模板时出现问题
- 指针映射的数组下标运算符