2

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

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];
}

执行时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 删除重复项吗?

4

2 回答 2

5

首先最重要的建议是:不要使用原始指针来执行手动内存管理。考虑改用智能指针(std::unique_ptr或者std::shared_ptr,基于适合您需要的特定所有权策略)。仅此一项就可以消除您遇到的问题。

现在考虑你的程序:

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

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

然后,您有责任实际从容器中删除元素,您可以按照您建议的方式执行此操作。

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

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

于 2013-04-13T11:04:28.163 回答
2

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

于 2013-04-13T11:25:26.053 回答