如果我继续使用原始指针,在shared_ptr中包装指针是否保证它会被删除



我有一个在运行时生成的哈希表,由全局变量填充。

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_uniquestd::make_shared创建它们,而不是使用new。然后,它们可以像其他一切一样得到管理。

不要那样做。

如果使用智能指针,请确保智能指针从一开始就"拥有"该内存。C++喜欢RAII的概念。

我想你想要unique_ptr-https://en.cppreference.com/w/cpp/memory/unique_ptr

也就是说,这只是一个确保内存被删除的智能点。

通常,总是使用智能指针而不是原始指针。这使得所有权更加清晰。但当你需要的时候,你可以把它公开为一个原始指针(*a(。但让智能指针来清理它吧。

相关内容

  • 没有找到相关文章

最新更新