如何解决我在删除向量之前没有使用删除指针会一直占用内存吗?
std::vector<State*> states;
states.push_back(new MenuState(window));
states.erase(states.begin());
这是我的代码。我在删除向量之前没有使用删除。 new MenuState(window)是一个指针。如果我不使用删除操作,会发生什么?我应该使用吗?指针会一直占用内存吗?以及如何解决这个问题?
解决方法
您可以使用智能指针:std::shared_ptr
或std::unique_ptr
。
对于std::shared_ptr
,您可以使用std::make_shared()
:
#include <memory> //for std::shared_ptr
#include <vector>
int main() {
std::vector<std::shared_ptr<State>> states;
states.push_back(std::make_shared<MenuState>(window));
states.erase(states.begin());
return 0;
}
或者,用std::unique_ptr
:
int main() {
std::vector<std::unique_ptr<State>> states;
states.push_back(std::make_unique<MenuState>(window));
states.erase(states.begin());
return 0;
}
,
如果不delete
vector
中存储的指针,则会泄漏内存。您将分配内存并失去对它的控制,并且它将继续保持分配状态,直到程序结束。
在这个简单的示例中,您应先擦除vector
和delete
每个指针,然后再擦除vector
。更好的做法是不要使用“裸新”并将std::unique_ptr
存储在vector
中,这样在销毁它们时会将分配的内存返回给系统。
是的,对于使用new
创建的任何对象,都需要在使用完毕后在其上调用delete
,否则它将泄漏并继续占用内存。
std::vector<State*> states;
states.push_back(new MenuState(window));
...
delete *states.begin();
states.erase(states.begin());
如果push_back()
失败并抛出异常,则也有泄漏的风险,除非您捕获到异常:
std::vector<State*> states;
State *new_state = new MenuState(window);
try {
states.push_back(new_state);
}
catch (...) {
delete new_state;
throw;
}
避免这两个问题的最佳方法是根本不对原始new
指针使用delete
/ State*
。改用std::unique_ptr<State>
智能指针,让它为您处理内存管理,例如:
std::vector<std::unique_ptr<State>> states;
states.push_back(std::make_unique<MenuState>(window));
...
states.erase(states.begin());
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。