我有一个在运行时生成的哈希表,由全局变量填充。
inline A* global1 = new A();
inline A* global2 = new A();
inline A* global3 = new A();
std::map<A*, int> createMap() {
return std::map<A*, int>({{global1, 1}, {global2, 2}, {global3, 3}});
}
我想在运行时向map
添加新条目,这意味着我必须创建指向A
的新指针。
void doStuff(std::map<A*, int>& map) {
A* runTimeValue = new A();
map[runTimeValue] = 4;
}
然而,这会导致程序内存泄漏,因为当映射对象最终超出范围并被删除时,我将不得不担心删除runTimeValue
。我考虑过将映射切换到std::map<std::shared_ptr<A>, int>
,但使用std::shared_ptr<A>
很困难,因为它有许多不同的子类。
我的一个解决方案是将runTimeValue
封装在shared_ptr中,这样它就可以自动删除,然后继续使用原始指针。
void doStuff(std::map<A*, int>& map) {
A* runTimeValue = new A();
std::shared_ptr<A> temp(runTimeValue);
map[runTimeValue] = 4;
}
这行得通吗?在地图超出范围之前,我是否需要存储对temp
的引用?有没有更好的方法来处理全局指针和运行时指针的混合,其中运行时指针必须删除,而全局指针则不删除?
编辑,";程序";使用中:
inline A* global1 = new A();
inline A* global2 = new A();
inline A* global3 = new A();
int main() {
while(true) {
std::map<A*, int> map = createMap();
doStuff(map);
doStuff(map);
doStuff(map);
}
}
您对此有点左右为难。你的提议不会有好结果。假设您实际上需要指针映射。。。
如果地图对其中包含的对象拥有唯一所有权,请使用std::map<std::unique_ptr <A>, int>
。如果它与代码的其他部分共享所有权,请使用std::map<std::shared_ptr <A>, int>
。
然后,无论哪种方式:
-
对象不会在地图中意外消失
-
当您从地图中删除对象时,对象将被清理(或其引用计数递减(
对于全局对象,可以根据需要使用std::make_unique
或std::make_shared
创建它们,而不是使用new
。然后,它们可以像其他一切一样得到管理。
不要那样做。
如果使用智能指针,请确保智能指针从一开始就"拥有"该内存。C++喜欢RAII的概念。
我想你想要unique_ptr
-https://en.cppreference.com/w/cpp/memory/unique_ptr
也就是说,这只是一个确保内存被删除的智能点。
通常,总是使用智能指针而不是原始指针。这使得所有权更加清晰。但当你需要的时候,你可以把它公开为一个原始指针(*a(。但让智能指针来清理它吧。