gpt4 book ai didi

c++ - 创建指向列表中对象的指针映射?

转载 作者:行者123 更新时间:2023-11-28 01:05:48 24 4
gpt4 key购买 nike

在一个业余项目中尝试修补内存泄漏时,我完全把自己与指针、列表、映射和内存等混淆了。

我想创建一个对象列表以在整个程序生命周期中使用。但我也想使用 map 通过其唯一 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;
}

}

我有其他想法也与 map 声明有关。我试过使用 iter 遍历列表,然后使用 mymap[id]=iter 或类似的变体。我的运气为零,无法正常工作。我知道我的基础知识在处理内存方面不在应有的水平。感谢您的帮助!

最佳答案

我会稍微改变一下,使用类似 std::shared_ptr<cObject> 的东西在您的列表和 map 中。对于 map ,您可以使用 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 获取。

这种方法的好处是您的列表和 map 现在指向同一个对象,因此如果您更改列表中的对象,更改也会反射(reflect)在 map 中。还有 shared_ptr object 会通过引用计数来管理指针的生命周期,所以一旦不再有对指针的引用,它就会调用delete。在指针上,而不必担心从每个容器中清理指针(并避免指针的所有权问题)。

关于c++ - 创建指向列表中对象的指针映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6254307/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com