【发布时间】:2021-04-06 22:42:55
【问题描述】:
std::unique_ptr不应该防止出现这种错误的可能性吗?
#include <iostream>
#include <vector>
#include <memory>
struct B {
int b;
};
int main()
{
std::vector<std::unique_ptr<B>> v; // unique_ptr can be stored in a container
B* p = new B;
v.emplace_back(p);
std::cout << "p:" <<p <<"\n";
std::cout << "v[0]:"<<v[0].get() << "\n";
v.emplace_back(p);
std::cout << "p:" <<p <<"\n";
std::cout << "v[1]:"<<v[1].get() << "\n";
}
检测到双重释放时的错误消息:
*** Error in `./a.out': double free or corruption (fasttop): 0x0000000001094c20 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x777e5)[0x7f3da200b7e5]
...
======= Memory map: ========
00400000-00402000 r-xp 00000000 ca:01 3228321 /tmp/1617748074.6996937/a.out
...
忽略双重释放时的输出:
p:0x1094c20
v[0]:0x1094c20
p:0x1094c20
v[1]:0x1094c20
【问题讨论】:
-
你应该只将一个特定的单个指针放入一个 unique_ptr once。当你这样做时,它认为它拥有它,并将释放它。它不知道你已经把它放入了一些other unique_ptr。你不能那样做。 (想想它如何可能防止您所描述的情况:每个 unique_ptr 都必须知道 所有其他 unique_ptrs 您必须确保它是唯一持有它所持有的东西的人?不。它是在你正确使用它。)
-
它应该像这样工作。您从同一个原始指针构造两个唯一指针,因此两者都尝试在最后释放它
-
请记住,指针是单向的。没有机制让指针知道还有谁在指向一个对象
shared_ptr甚至不知道还有谁在指向。它只知道计数。 -
建议:通过虔诚地使用
std::make_unique来避免这种可能性。 -
C++ 不会阻止你做错事
标签: c++ c++17 unique-ptr