我有一个编码分配,我需要释放我分配的任何内存,所以我试图删除我的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
答案 0 :(得分:3)
错误很明显:
delete
以pointer
为参数,不为unique_ptr
。 为什么在尝试使用unique_ptr
时出于同样的目的而删除指针?使用智能指针(如unique_prt
或shared_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
的调用将具有相同的效果。