C++11 管理唯一的向量ptr'的正确方法是什么;s

C++11 管理唯一的向量ptr'的正确方法是什么;s,c++11,segmentation-fault,unique-ptr,C++11,Segmentation Fault,Unique Ptr,如果我有一个类正在管理std::unique_ptrs的向量,那么管理该资源的正确方法是什么?我有以下一个最低限度的工作示例。但是,当运行此代码时,会出现分段错误。我想这是因为mains在AContainer::addValue中引用了binget的std::moved,但我不确定,也不确定如何测试该假设 #include <memory> #include <vector> #include <iostream> class AnotherContaine

如果我有一个类正在管理
std::unique_ptr
s的向量,那么管理该资源的正确方法是什么?我有以下一个最低限度的工作示例。但是,当运行此代码时,会出现分段错误。我想这是因为
main
s在
AContainer::addValue
中引用了
bin
get的
std::move
d,但我不确定,也不确定如何测试该假设

#include <memory>
#include <vector>
#include <iostream>

class AnotherContainer;

class AContainer{
    public:
        void addValue(AnotherContainer& anInt);
        const std::vector<std::unique_ptr<AnotherContainer>>& getVals() const;
    private:
        std::vector<std::unique_ptr<AnotherContainer>> ints;
};

void AContainer::addValue(AnotherContainer& anInt){
    ints.push_back(std::move(std::unique_ptr<AnotherContainer>(&anInt)));
}

const std::vector<std::unique_ptr<AnotherContainer>>& AContainer::getVals() const{
    return ints;
}

class AnotherContainer{
    public:
        AnotherContainer(int val) : myVal(val){};
        int getVal() const{
            return myVal;
        }
    private:
        int myVal;
};

int main(){
    AContainer bin;
    AnotherContainer val1(1), val2(2);
    bin.addValue(val1);
    bin.addValue(val2);
    const std::vector<std::unique_ptr<AnotherContainer>>& vals = bin.getVals();
    std::cout << "vals[0] = " << vals[0]->getVal() << std::endl;
    return 0;
}
#包括
#包括
#包括
另一类容器;
类容器{
公众:
void addValue(另一个容器&anInt);
常量std::vector&getVals()常量;
私人:
std::向量整数;
};
void a容器::addValue(另一个容器&anInt){
int.push__-back(std::move(std::unique_-ptr(&anInt));
}
常量std::向量和容器::getVals()常量{
返回整数;
}
另一类容器{
公众:
另一个容器(int-val):myVal(val){};
int getVal()常量{
返回myVal;
}
私人:
int myVal;
};
int main(){
容器箱;
另一容器val1(1)、val2(2);
bin.addValue(val1);
bin.addValue(val2);
const std::vector&vals=bin.getVals();

std::cout发生的事情是,您正在堆栈上创建两个容器实例:

AnotherContainer val1(1), val2(2);
然后在addValue调用中包装指向这些引用的指针:

bin.addValue(val1);
bin.addValue(val2);
因此,当对main函数的调用返回时,在堆栈上创建的对象val1和val2将被删除,但在删除bin时也会被删除,因为智能指针会调用它们包装的对象上的析构函数,从而导致分段错误

智能指针用于管理堆上的内存,并使用新的运算符进行分配,因此,为了使事情顺利运行,您应该通过以下方式初始化val1和val2:

AnotherContainer* val1 = new AnotherContainer(1);
AnotherContainer* val2 = new AnotherContainer(2);

(您还必须对程序的编译方法进行一些更改)

这确实有效。我必须阅读有关“堆栈”和“堆”的内容,我已经看到了很多关于这些术语的内容。此外,无需更改我的方法,我只需调用
bin.addValue(*val1)
并保持方法不变。谢谢!请注意,使用
std::make_unique(args…
而不是
std::unique(new T(args…))
是一个好习惯,前者具有更好的异常安全性。