我有一个带矢量的结构,我需要存储一个指向其中一个项目的指针。用赤裸的指针,我会这样做:
#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
有任何帮助吗?感谢
答案 0 :(得分:7)
std::unique_ptr
背后的哲学是所有权,即它是一个拥有一个记忆区域的对象,将后者的生命周期与其自身联系起来。
std::vector
遵循相同的路径:它声明它包含的元素的所有权。因此,当它的析构函数运行时,它会触发其元素的析构函数(如果它们是用户定义的类型)。
在您的情况下,v
拥有v.front()
,但您也对uv
承担了此责任。现在,他们两个将尝试销毁同一个对象。
最好在这里使用原始指针,或者(更好)使用迭代器,因为它仅用作观察者。