Для начала я должен сказать, что работаю в visual studio 2019 и использую стандарт c ++ 17. Итак, у меня есть этот синглтон:
//DataFrame.h
class DataFrame;
using std::string;
using boost::unordered_map;
using xt::xarray;
class DataFrameDestroyer
{
private:
DataFrame* p_instance;
public:
~DataFrameDestroyer();
void initialize(DataFrame* p);
};
class DataFrame
{
private:
static DataFrame* p_instance;
static DataFrameDestroyer destroyer;
unordered_map<string, xarray<string>> factorNameColumns;
unordered_map<string, xarray<double>> factorValueColumns;
protected:
DataFrame() { }
DataFrame(const DataFrame&);
DataFrame& operator=(DataFrame&);
~DataFrame() { }
friend class DataFrameDestroyer;
public :
static DataFrame& GetInstance();
//...more code
double GetLogLikeGradient(string dfactor, string dfvalue);
};
//DataFrame.cpp
#include "DataFrame.h"
DataFrame* DataFrame::p_instance = 0;
DataFrameDestroyer DataFrame::destroyer;
DataFrameDestroyer::~DataFrameDestroyer() {
delete p_instance;
}
void DataFrameDestroyer::initialize(DataFrame* p) {
p_instance = p;
}
DataFrame& DataFrame::GetInstance() {
if (!p_instance) {
p_instance = new DataFrame();
destroyer.initialize(p_instance);
}
return *p_instance;
}
И я получил следующую проблему в функции GetLogLikeGradient :
//...
for (int row = 0; row < rowCount; row++) {
for (auto valuelist : factorValueColumns) {
double factorMultiplier = valuelist.second[row];
//...
}
//more code...
}
Когда я пытаюсь получить значения из unordered_map factorValueColumns содержит только нулевые векторы xarray
Я не могу понять, что может вызвать такое поведение.
Конечно, factorValueColumns инициируется до этого. И в режиме отладки я вижу, что unordered_map factorValueColumns полон правильных векторов xarray непосредственно перед вызовом GetLogLikeGradient .
Также интересно, что factorNameColumns вэта функция содержит правильные векторы xarray. Так что, может быть, это просто хитрая ошибка xarray ...