AJ.*_*AJ. 2 c++ algorithm stl vector
我有一个自定义对象的向量。
vector<MyObject*> newOnes;
Run Code Online (Sandbox Code Playgroud)
在填充它的一些操作之后,newOnes可能有重复的对象,所以我使用 std:unique()。
std::unique(newOnes.begin(), newOnes.end(), isEquivalent); //isEquivalent return true if equal
Run Code Online (Sandbox Code Playgroud)
现在,在使用完向量后,我继续使用以下函数释放内存
void MyCalss::releaseSource(vector<MyObject*> v) {
for (unsigned int i = 0; i < v.size(); i++ )
delete v[i];
}
Run Code Online (Sandbox Code Playgroud)
在执行releaseSource(newOnes);
这会导致崩溃。我知道 std:unique 正在创建悬空指针因此崩溃,但我不能在这里使用智能指针。
我可以在这里做些什么来避免这种情况?
像下面这样使用 std:unique 会解决问题吗?
std::sort(new_combs.begin(), new_combs.end());
newOnes.erase(std::unique(newOnes.begin(), newOnes.end()), newOnes.end());
//// so operations
releaseSource(newOnes); //still need to free the other members
Run Code Online (Sandbox Code Playgroud)
我现在无法移动到智能指针(唯一/共享)。这将涉及更改我无法修改的代码。
我可以在这里使用 std::set 删除重复项吗?
首先是最重要的建议:不要使用原始指针来执行手动内存管理。考虑改用智能指针(std::unique_ptr或者std::shared_ptr,基于适合您需求的特定所有权策略)。仅此一项就可以消除您遇到的问题。
现在考虑你的程序:
像下面这样使用 std:unique 会解决问题吗?
std::unique()并没有从容器中删除重复的元素,它只是四处移动元素,并返回你的迭代器的容器的新的逻辑结束。
然后你有责任从容器中实际删除元素,你可以按照你建议的方式来做。
但是请注意,如果isEquivalent以一种回报被定义true为是对象不是同一个对象(这听起来可能,否则你可能会直接省略了谓语),你可能会泄漏内存,因为std::unique可以在最后一次指针覆盖到一定目的。
所以再一次:考虑使用智能指针而不是原始指针和手动内存管理。