从自定义对象- std:unique的向量中消除重复项会导致崩溃



我有一个自定义对象向量。

vector<MyObject*> newOnes;

经过一些填充操作后,newOnes可能有重复的对象,所以我使用std:unique()。

std::unique(newOnes.begin(), newOnes.end(), isEquivalent); //isEquivalent return true if equal

现在,在我用完向量之后,我继续使用下面的函数

来释放内存
void MyCalss::releaseSource(vector<MyObject*> v) {
    for (unsigned int i = 0; i < v.size(); i++ )
        delete v[i];
}

On执行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

我现在不能移动到智能指针(唯一/共享)。这将涉及到代码的变化,我不能修改。

我可以使用std::set来删除这里的重复项吗?

首先最重要的建议是:不要使用原始指针来执行手动内存管理。考虑使用智能指针(std::unique_ptrstd::shared_ptr,根据适合您需要的特定所有权策略)。这就会消除你的问题。

现在考虑你的程序:

像下面这样使用std:unique能解决问题吗?

std::unique()从容器中删除重复的元素,它只是移动元素并返回一个迭代器到容器的新逻辑端。

从容器中移除元素是你的责任,你可以按照你的建议去做。

但是,请注意,如果isEquivalent的定义方式为不是相同对象返回true(听起来很有可能,否则您可以直接省略谓词),则可能会泄漏内存,因为std::unique可能会覆盖指向某个对象的最后一个指针。

所以再一次:考虑使用智能指针代替原始指针和手动内存管理

unique不要删除vector中的对象。但是std::unique可以复制vector中的某些元素例如,如果int型的vector具有以下元素:[1 2 2 3 4]。那么unique的结果是:[1 2 3 4 4]。所以,你可以看到,元素'4'被唯一复制了。让我们把这种情况移到指针。如果vector中的'4'是指针,那么如果使用releaseSource删除指针,'4'将被删除两次。这就是崩溃发生的原因。

最新更新