std::unique_ptr
のベクトルを管理しているクラスがある場合、このリソースを管理する適切な方法は何ですか?私は以下の最小の実例を持っています。ただし、このコードを実行すると、セグメンテーションフォルトが発生します。これはmain
のbin
への参照がstd::move
dのAContainer::addValue
にありますが、わかりません。その仮定をどのようにテストするのか分かりません。呼び出しunique_ptrのベクトルを管理する適切な方法は何ですか?
AnotherContainer val1(1), val2(2);
をしてからaddValueでこれらの参照にポインタをラップ:
#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;
}
これは機能しました。私は「スタック」と「ヒープ」について読まなければならないでしょう。また、私のメソッドを変更する必要はなく、単に 'bin.addValue(* val1)'を呼び出してメソッドをそのまま保つことができます。ありがとうございました! – wesanyer
'std :: unique_ptr (new T(args ...))'の代わりに 'std :: make_unique(args ...)'を使うのは良い習慣であることに注意してください。安全性。 –