【问题标题】:I am not using delete before erase to vector. will the pointer always take up memory?我没有在擦除到矢量之前使用删除。指针会一直占用内存吗?
【发布时间】:2020-09-05 03:34:45
【问题描述】:
std::vector<State*> states;
states.push_back(new MenuState(window));
states.erase(states.begin());

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

【问题讨论】:

  • 你会泄漏很多内存。
  • 我该如何解决?感谢您的评论。
  • 考虑使用智能指针

标签: c++ pointers memory new-operator delete-operator


【解决方案1】:

如果你不delete 存储在vector 中的指针,你会泄漏内存。您将分配内存并失去对它的控制,它将继续保持分配状态,直到您的程序结束。

在这个简单的示例中,您应该在擦除 vector 之前检查您的 vectordelete 每个指针。更好的是不使用“naked new”并将std::unique_ptrs 存储在vector 中,这样当它们被销毁时,它们会将分配的内存返回给系统。

【讨论】:

    【解决方案2】:

    您可以使用智能指针: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;
    }
    

    【讨论】:

    • 非常感谢您的帮助。 uniqe 和 shared 有什么区别?
    • 我必须先从向量中擦除而不是删除指针。我有图书馆的错误。 RenderTarget.cpp(152) 中的内部 OpenGL 调用失败。表达式:glClearColor(color.r / 255.f, color.g / 255.f, color.b / 255.f, color.a / 255.f) 错误描述:GL_INVALID_OPERATION 当前状态不允许指定操作. RenderTarget.cpp(153) 中的内部 OpenGL 调用失败。表达式:glClear(GL_COLOR_BUFFER_BIT)……我认为唯一指针先删除。
    【解决方案3】:

    是的,对于你使用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;
    }
    

    避免这两个问题的最佳方法是根本不在原始State* 指针上使用new/delete。请改用std::unique_ptr&lt;State&gt; 智能指针,让它为您处理内存管理,例如:

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

    【讨论】:

    • 我要哭了。我有这个:RenderTarget.cpp(152) 中的内部 OpenGL 调用失败。表达式:glClearColor(color.r / 255.f, color.g / 255.f, color.b / 255.f, color.a / 255.f) 错误描述:GL_INVALID_OPERATION 当前状态不允许指定操作. RenderTarget.cpp(153) 中的内部 OpenGL 调用失败。表达式:glClear(GL_COLOR_BUFFER_BIT) 错误描述:GL_INVALID_OPERATION 当前状态不允许指定的操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-19
    • 1970-01-01
    • 2019-01-14
    • 1970-01-01
    • 1970-01-01
    • 2021-06-14
    • 1970-01-01
    相关资源
    最近更新 更多