gpt4 book ai didi

c++ - 从 vector 中删除对象内存的最佳方法

转载 作者:太空狗 更新时间:2023-10-29 23:48:48 31 4
gpt4 key购买 nike

我有一个 vector ,其中包含在堆上分配的对象。我想从 vector 中删除一些元素。这是从 vector 中删除元素并将其删除的最佳方法。

在下面的代码中尝试了一种方法:

class MyObj
{
bool rem;
public:
MyObj(bool r) : rem(r) { cout << "MyObj" << endl; }
~MyObj() { cout << "~MyObj" << endl; }

bool shouldRemove() const noexcept { return rem; }
};


int main()
{
vector<MyObj*> objs;
objs.push_back(new MyObj(false));
objs.push_back(new MyObj(true));
objs.push_back(new MyObj(false));
objs.push_back(new MyObj(true));

auto itr = objs.begin();
while (itr != objs.end())
{
if ((*itr)->shouldRemove())
{
delete *itr;
*itr = nullptr;

itr = objs.erase(itr);
}
else
++itr;
}

// size will be two
cout << "objs.size() :" << objs.size() << endl;

return 0;
}

最佳答案

就删除和delete 对象而言,您的循环很好(不需要nullptr 赋值)。但是您的其余代码很容易出现内存泄漏。如果 push_back() 抛出,您将泄漏刚刚新建的对象。并且您不会删除循环结束后仍在 vector 中的对象。

Which is the best way to remove element from vector and delete it

最好的 选项是根本不使用原始指针。将实际的对象实例直接存储在 vector 中,并让 vector 在您删除它们时为您销毁实例,并且当 vector 本身超出范围时被销毁:

int main() {
std::vector<MyObj> objs;

objs.emplace_back(false);
objs.emplace_back(true);
objs.emplace_back(false);
objs.emplace_back(true);

auto itr = objs.begin();
while (itr != objs.end()) {
if (itr->shouldRemove())
itr = objs.erase(itr);
else
++itr;
}

/* alternatively:
objs.erase(
std::remove_if(objs.begin(), objs.end(),
[](auto &o){ return o.shouldRemove(); }),
objs.end()
);
*/

// size will be two
std::cout << "objs.size() :" << objs.size() << std::endl;

return 0;
}

否则,如果需要存储指向动态分配对象的指针,至少要使用智能指针来管理它们:

int main() {
std::vector<std::unique_ptr<MyObj>> objs;

objs.push_back(std::unique_ptr<MyObj>(new MyObj(false)));
objs.push_back(std::unique_ptr<MyObj>(new MyObj(true)));
objs.push_back(std::unique_ptr<MyObj>(new MyObj(false)));
objs.push_back(std::unique_ptr<MyObj>(new MyObj(true)));

/* alternatively, if you are using C++14 or later
objs.push_back(std::make_unique<MyObj>(false));
objs.push_back(std::make_unique_ptr<MyObj>(true));
objs.push_back(std::make_unique<MyObj>(false));
objs.push_back(std::make_unique<MyObj>(true));
*/

auto itr = objs.begin();
while (itr != objs.end()) {
if ((*itr)->shouldRemove())
itr = objs.erase(itr);
else
++itr;
}

/* alternatively:
objs.erase(
std::remove_if(objs.begin(), objs.end(),
[](auto &o){ return o->shouldRemove(); }),
objs.end()
);
*/

// size will be two
std::cout << "objs.size() :" << objs.size() << std::endl;

return 0;
}

关于c++ - 从 vector 中删除对象内存的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52463430/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com