1

我听说过几次提到std::vector存储原始指针时不是异常安全的,应该使用unique_ptrorshared_ptr代替。

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

4

2 回答 2

5

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 的指针容器。)

于 2012-04-10T22:48:09.007 回答
2

通过“非异常安全”,我认为它们意味着如果向量在异常期间被展开破坏,则会出现内存泄漏。

Shared_ptr 确保当向量本身被销毁时,指针指向的对象被删除。

另一种选择是Boost 指针容器

于 2012-04-10T22:45:51.377 回答