вектор встроенной инициализации структур. приготовился-INIT-лист - PullRequest
0 голосов
/ 05 ноября 2018

Я столкнулся со странной проблемой, которую, к сожалению, я не могу воспроизвести за пределами самого приложения. Ситуация как ниже. У меня есть следующая структура.

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. Члены рассматриваемого класса не выставляются вне класса. Просто методы класса общедоступны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...