std :: vector不是异常安全的吗?

时间:2012-04-10 22:38:27

标签: c++ vector

我听说它曾多次提到std::vector在存储原始指针时不是异常安全的,而且应该使用unique_ptrshared_ptr代替。{/ p>

我的问题是,为什么std::vector不是异常安全的,这些类如何解决这个问题?

2 个答案:

答案 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