我听说过几次提到std::vector
存储原始指针时不是异常安全的,应该使用unique_ptr
orshared_ptr
代替。
我的问题是,为什么std::vector
不是异常安全的,这些类如何解决这个问题?
这std::vector
不是异常安全的,它使用原始指针进行内存管理:
int main()
{
try
{
int* i = new int;
throw "oops, memory leak!";
}
catch (...){}
}
这与向量本身无关,只是这样做是完全相同的问题:
int main()
{
try
{
std::vector<int*> vi;
vi.push_back(new int);
throw "oops, memory leak!";
}
catch (...){}
}
这两个都是通过使用智能指针来修复的:
int main()
{
try
{
std::unique_ptr<int> i(new int);
std::vector<std::unique_ptr<int>> vi;
vi.push_back(std::unique_ptr<int>(new int));
vi.push_back(std::move(i));
throw "vector destroys unique_ptr's...which delete their memory";
}
catch (...){}
}
(或者shared_ptr
,更昂贵。您也可以使用来自 Boost 的指针容器。)