Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 指向唯一\u ptr的裸指针_C++_Pointers_C++11_Unique Ptr - Fatal编程技术网

C++ 指向唯一\u ptr的裸指针

C++ 指向唯一\u ptr的裸指针,c++,pointers,c++11,unique-ptr,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

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

#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;
}
既然C++11还没有实现make_unique,我怎么能用unique_ptr做同样的事情呢?我尝试通过使uv成为唯一的_ptr并调用uv.reset&v.front;,来分配front元素;,但我得到了以下错误:

malloc: *** error for object 0x7f856bc0bcf0: pointer being freed was not allocated
有什么帮助吗?感谢

std::unique\u ptr背后的理念是所有权,也就是说,它是一个拥有一个内存区域的对象,将后者的生命周期与其自身的生命周期联系起来

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

在您的情况下,v拥有v.front,但您也将此责任交给了uv。现在,他们两个都会试图摧毁同一个物体


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

该指针不拥有任何东西。不要为此使用智能指针。使用原始指针或迭代器。实际上,您不应该从引用中获取指针并永久存储它&v、 只有v不变时,“前”才有效。事实上,uv并没有指向需要释放的内存。我不相信您对unique_ptr的预期用途是规范的。FWIW您可以使用构造函数初始化一个唯一的\u ptr:unique\u ptr ptrnew int;或者您可以使用另一个唯一的\u ptr初始化,但必须移动数据:唯一的\u ptr其他移动ptr;这是因为unique_ptr是可移动分配和可移动构造的,但不是可复制分配或可复制构造的。这样做的目的是保留所有权,并清楚地说明是什么原因造成了该物品的毁坏。正如您正确地指出的,make_unique将出现在C++14中,在此之前,我们一直使用旧语法。这似乎是一个XY问题。OP正在存储一个迭代器/指针,该迭代器/指针指向它不拥有的内部地址,如果向量的状态发生变化,则该迭代器/指针可能无效。很有可能这真的是一个设计问题-您试图解决的实际问题是什么?在这里如何使用迭代器?只是int uv=v.front?auto uv=v.begin?但我不能将auto作为结构成员,因为它不是实际的类型。
malloc: *** error for object 0x7f856bc0bcf0: pointer being freed was not allocated