std::vector
には、C++スマートポインタを使用してクラスを格納しています(A
としましょう)(ベクトルの相違はstd::vector<std::shared_ptr<A>>
です)。何らかの理由でshared_from_thisは、std :: shared_ptrの所有権の後でも空の_M_weak_thisです。
#include <iostream>
#include <memory>
#include <vector>
class A : std::enable_shared_from_this<A> {
public:
void doWork();
std::shared_ptr<A> getSharedRef();
};
void A::doWork() { std::cout << "Working..." << std::endl; }
std::shared_ptr<A> A::getSharedRef() { return shared_from_this(); }
class AManager {
static std::vector<std::shared_ptr<A>> aList;
public:
static void init(); // safety because statics
static void doLotsOfWork();
static std::shared_ptr<A> createA();
};
std::vector<std::shared_ptr<A>> AManager::aList;
void AManager::init() { aList = std::vector<std::shared_ptr<A>>{}; }
void AManager::doLotsOfWork() {
for (auto a : aList) {
a->doWork();
}
}
std::shared_ptr<A> AManager::createA() {
std::shared_ptr<A> a = std::make_shared<A>();
aList.push_back(a);
return a->getSharedRef(); // <----- EXCEPTION
}
int main() {
AManager::init();
AManager::createA();
return 0;
}
、これはstd::bad_weak_ptr
をスローし、検査時に、私はそのa
に気づく、何らかの理由で、0x0
、またはNULL
に等しい_M_weak_this
を持っています。オブジェクトを参照している有効なstd::shared_ptr
をすでに作成しているので、空であってはなりません。
さらに、A
(変数付き)は完全にそのアドレスにそのまま残っているため、メモリの破損は起こっていません。
私は間違っていますか?
あなたの説明はかなり良いです。エラーを正確に再現するコードを提供する方が良いでしょう。どのように[mcve]を作成するのかを見てください – AndyG
この特定のケースでMCVEの最大の問題は、コードが多くの動く部品に依存しており、どの部品がエラーを引き起こしているのか正確にはわかりません。問題のコードにgithubリンクがありますが、それ以外の場合は、実際の例をスピンアップするのに数時間かかるでしょう。 – CalmBit
なぜgetsharedref()が必要ですか? (そしてshared_from_this()を直接使用するのではないでしょうか?)Aは私的に継承するからですか?はいの場合、それは問題になる可能性があります。 –