指向unique_ptr的裸指针

时间:2014-04-11 13:48:18

标签: c++ pointers c++11 unique-ptr

我有一个带矢量的结构,我需要存储一个指向其中一个项目的指针。用赤裸的指针,我会这样做:

#include <iostream>
#include <vector>
#include <memory>
#include <unistd.h>

struct A {
    A () {
        v = {1, 2, 3, 4};
        uv = &v.front();
    }

    std::vector<int> v;
    int* uv;
};

int main()
{
    A a;
    std::cout << *a.uv << std::endl;
    return 0;
}

现在,我可以用make_shared

删除裸指针
struct A {
    A () {
        v = {1, 2, 3, 4};
        uv = std::make_shared<int>(v.front());
    }

    std::vector<int>     v;
    std::shared_ptr<int> uv;
};

由于C ++ 11还没有实现make_unique,我怎么能用unique_ptr做同样的事情呢?我尝试通过uv unique_ptr并调用uv.reset(&v.front());来分配前面的元素,但是我收到以下错误:

malloc: *** error for object 0x7f856bc0bcf0: pointer being freed was not allocated

有任何帮助吗?感谢

1 个答案:

答案 0 :(得分:7)

std::unique_ptr背后的哲学是所有权,即它是一个拥有一个记忆区域的对象,将后者的生命周期与其自身联系起来。

std::vector遵循相同的路径:它声明它包含的元素的所有权。因此,当它的析构函数运行时,它会触发其元素的析构函数(如果它们是用户定义的类型)。

在您的情况下,v拥有v.front(),但您也对uv承担了此责任。现在,他们两个将尝试销毁同一个对象。

最好在这里使用原始指针,或者(更好)使用迭代器,因为它仅用作观察者。