我听说它曾多次提到std::vector
在存储原始指针时不是异常安全的,而且应该使用unique_ptr
或shared_ptr
代替。{/ p>
我的问题是,为什么std::vector
不是异常安全的,这些类如何解决这个问题?
答案 0 :(得分:5)
不是std::vector
并非异常安全,它使用原始指针进行内存管理:
int main()
{
try
{
int* i = new int;
throw "oops, memory leak!";
}
catch (...){}
}
这与vector本身无关,只是这样做是完全相同的问题:
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的指针容器。)
答案 1 :(得分:2)
通过“非例外安全”我认为它们意味着如果向量在异常期间被展开破坏,则会发生内存泄漏。
Shared_ptr确保在向量本身被销毁时删除指针指向的对象。
另一种选择是Boost pointer containers。