在尝试修补旁边项目中的内存泄漏时,我完全把自己与指针和列表以及地图和内存混淆等等。
我想创建一个在整个程序生命周期中使用的对象列表。但我也希望使用地图通过其唯一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或类似的变体。我没有运气,没有任何工作。我知道我的基本原理并不是他们在处理记忆方面应该做的事情。任何帮助表示赞赏!
答案 0 :(得分:3)
我会改变这一点,并在列表和地图中使用类似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
而无需担心清理从每个容器指出(并避免指针的所有权问题)。
答案 1 :(得分:0)
您不需要列表和地图。地图支持迭代的方式与列表的方式非常相似,因此您可以通过密钥快速访问地图中的值,并通过迭代缓慢访问。我也怀疑你为什么要用new创建东西 - char数组应该是std :: string,而对象本身应该是值。