Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从std::vector中删除动态分配的对象_C++_Vector - Fatal编程技术网

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

C++ 从std::vector中删除动态分配的对象,c++,vector,C++,Vector,这是正确的吗 std::vector<Enemy*> enemies; enemies.push_back(new Enemy()); Enemy* enemy = enemies[0]; enemies.erase(enemies.begin() + 0); delete enemy; std::向量敌人; 敌人。推回(新敌人); 敌人*敌人=敌人[0]; 敌人。清除(敌人。开始()+0); 删除敌人; 是的,很好。您可以将其简化一点: delete enemies[0]; e

这是正确的吗

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

Enemy* enemy = enemies[0];
enemies.erase(enemies.begin() + 0);
delete enemy;
std::向量敌人;
敌人。推回(新敌人);
敌人*敌人=敌人[0];
敌人。清除(敌人。开始()+0);
删除敌人;

是的,很好。您可以将其简化一点:

delete enemies[0];
enemies.clear();
要删除该元素,还可以使用:

enemies.pop_back();
或者(与您的非常相似):


在我看来当然不错。您不需要
+0
敌人中。删除
行,但除此之外,它完全可以。

它可以工作,是的,但不是理想的方法

首先,添加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
}
模板
无效无序弹出式前端(标准::矢量和矢量)
{
使用std::swap;
交换(vec.front(),vec.back());//恒定时间
vec.pop_back();//恒定时间
}
它将前面的元素与后面的元素交换,然后将其弹出。当然,秩序不会被保留

另一个问题是内存管理方法。任何时候你有明确的清理代码,你已经做了一些错误。应该是

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

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

现在我们知道,代码> PuxSuff-<代码>不能分配内存,如果<代码>保留< /代码>失败,则在<代码>敌人< /代码>之前抛出异常。

通常:考虑使用共享指针的向量,或<代码> Boo::pTrvector vector < /C> >。这里是指向指针容器的链接,C0wb0y谈论的一个空间:你
推回(新敌人)
?难道你不知道把你的敌人推到背后是不公平的吗-D@Pavel:不仅不公平,而且不明智:让你的朋友和你的敌人更亲近。什么叫~敌军()?是vector.erase()/vector.clear()还是删除敌人[0]?@Ryan:
delete
调用指向对象的析构函数,然后释放内存。
std::vector<Enemy*> enemies;
enemies.push_back(new Enemy());
std::vector<Enemy*> enemies;
enemies.reserve(1);    // or more generally, enemies.reserve(enemies.size()+1);
enemies.push_back(new Enemy());