Я столкнулся со странной проблемой, которую, к сожалению, я не могу воспроизвести за пределами самого приложения. Ситуация как ниже. У меня есть следующая структура.
struct Foo {
std::string first;
std::string second;
bool flag;
float value;
};
Один из моих классов имеет члена std::vector<Foo> fooList
, который периодически выполняет следующий набор операций.
void someOperation() {
UpdateFooList(); //< Updates existing members of fooList
UseFooList(); //< Do some useful stuff with the new values.
fooList.clear();
// Repopulate fooList which is where the problem is. The call below
// has never worked here. It results in either junk values
// in fooList[0] or some of the member values at [0] before the clear() call
// appear to be retained after the emplace_back
fooList.emplace_back(Foo{"First", "Second", true, 0.0f});
}
Вот вещи, которые я пробовал.
- Чтобы убедиться, что данные не были повреждены, попытайтесь вставить мьютексы везде, где есть доступ к
fooList
.
- Попытался создать ctor с 4 значениями для Foo с подписью
Foo(const std::string&, const std::string&, bool, float)
и использовал этот ctor вместо brace-init-list. Не повезло.
- Попробовал заменить
emplace_back
на push_back
в коде выше. Это тоже не помогло.
- Попытался воспроизвести эти проблемы в изолированном файле cpp, и он работает точно так, как ожидалось.
Единственное, что работает в приложении, - это заменить emplace_back
на две следующие строки.
auto fooEntry = Foo{"First", "Second", true, 0.0f};
fooList.push_back(fooEntry); //< This works as expected.
fooList.emplace_back(fooEntry); //< This also works as expected
Есть мысли, почему не работают встроенные вызовы fooList.emplace_back(Foo{"First", "Second", true, 0.0f});
?
Я на gcc-7.2.0
и приложение скомпилировано с использованием c++14
стандартов.
Хотя этот бит информации может не иметь отношения, добавьте его сюда для полноты. Рассматриваемый класс компилируется с использованием c++14
и предоставляется с помощью файла .so, а само приложение компилируется с использованием c++17
и загружает .so. Члены рассматриваемого класса не выставляются вне класса. Просто методы класса общедоступны.