删除unique_ptr指向的内容

时间:2014-05-12 05:37:50

标签: c++ unique-ptr delete-operator

我有一个编码分配,我需要释放我分配的任何内存,所以我试图删除我的unique_ptr所指向的所有信号量。 unique_ptrs都在地图中。代码片段:

static map<string, unique_ptr<semaphore>> locks;

这是使用“new”创建所有信号量的地方:

 89         unique_ptr<semaphore>& up = locks[article.title];
 90         if (up == nullptr) {
 91                 up.reset(new semaphore(6));
 92         }

稍后,我尝试删除以下代码中的信号量:

160         for (map<string, unique_ptr<semaphore>>::iterator it = locks.begin(); it != locks.end();
161                 ++it) {
162                 cout << it->first << endl;
163                 delete it->second;
164         }

我收到编译错误:

news-aggregator.cc: In function âvoid processAllFeeds(const string&)â:
news-aggregator.cc:163:14: error: type âclass std::unique_ptr<semaphore>â argument given to âdeleteâ, expected pointer
make: *** [news-aggregator.o] Error 1

3 个答案:

答案 0 :(得分:3)

错误很明显:

deletepointer为参数,unique_ptr为什么在尝试使用unique_ptr时出于同样的目的而删除指针?使用智能指针(如unique_prtshared_ptr)的意义在于它们在不再需要时(即超出范围)自动删除指向的对象,或者您明确使用{{1 }。

答案 1 :(得分:2)

您需要做的就是删除unique_ptr指向reset unique_ptr的内容,

it->second.reset();

答案 2 :(得分:0)

std::unique_ptr的目的是拥有内存分配,并在超出范围时自动delete。如果您确实需要尽早手动释放唯一指针的内存,可以采用相应的方法(reset等)。

在特定情况下,如果删除容器中的条目,将自动释放内存。

     for (auto it = locks.begin(), endit = locks.end(); it != endit; ++it) {
             cout << it->first << endl;
             delete it;
     }

这里我们删除容器的元素,它隐式调用unique_ptr的析构函数,delete它拥有的内存。

如果容器的迭代器因删除而失效,则无法使用此模式。

如果您有完整的C ++ 11支持,可以使用:

    for (auto it : locks) {
        std::cout << it.first << '\n';
        delete it.second;
    }

但更好的是:

    for (auto it : locks)
        std::cout << it.first << '\n';
    locks.clear();

clear的调用会自动调用unique_ptr::~unique_ptr每个元素的值。如果您没有C ++ 11,只需用迭代器循环替换for循环,对clear的调用将具有相同的效果。