我在删除向量之前没有使用删除指针会一直占用内存吗?

问题描述

std::vector<State*> states;
states.push_back(new MenuState(window));
states.erase(states.begin());

这是我的代码。我在删除向量之前没有使用删除。 new MenuState(window)是一个指针。如果我不使用删除操作,会发生什么?我应该使用吗?指针会一直占用内存吗?以及如何解决这个问题?

解决方法

您可以使用智能指针:std::shared_ptrstd::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中存储的指针,则会泄漏内存。您将分配内存并失去对它的控制,并且它将继续保持分配状态,直到程序结束。

在这个简单的示例中,您应先擦除vectordelete每个指针,然后再擦除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());