从std :: vector中删除动态分配的对象

Rya*_*yan 5 c++ vector

它是否正确?:

std::vector<Enemy*> enemies;
enemies.push_back(new Enemy());

Enemy* enemy = enemies[0];
enemies.erase(enemies.begin() + 0);
delete enemy;
Run Code Online (Sandbox Code Playgroud)

GMa*_*ckG 8

它是有效的,是的,但它不是一种理想的方法.

首先,添加0只是噪音,你可以删除它.但更好的是,只需使用pop_front().另外,不需要中间步骤,可以在删除之前删除.

但是std::vector从前面弹出并不好,特别是如果它很大(因为剩余的元素需要移动以填补空白).如果您不需要连续内存,请使用std::deque替代内存.或者,如果订单无关紧要,您可以使用以下内容:

template <typename T, typename A>
void unordered_pop_front(std::vector<T, A>& vec)
{
    using std::swap;
    swap(vec.front(), vec.back()); // constant time

    vec.pop_back(); // constant time
}
Run Code Online (Sandbox Code Playgroud)

它将前部元件与后部元件交换,然后将其弹出.当然,订单不会保留.

另一个问题是你的内存管理方法.任何时候你有明确的清理代码,你做错了什么.它应该自动完成.

请使用Boost的ptr_vector,或者std::vector智能指针.(注意:不要std::auto_ptr在容器中使用,在这方面它是坏的.)对于快速智能指针建议,使用std::unique_ptr(如果您的编译器支持C++ 0x),或std::/boost::shared_ptr.