Я заметил эти последовательности вызова в большой программе, как показано ниже: (обратный порядок стека вызовов)
// call step 1
std::vector<std::string> fieldNames = this->getUniqueMangledFieldNames(sigHierInfo); // fieldNames have "a" and "b"
// call step 2
std::vector<std::string> SlFileIOBlockContext::getUniqueMangledFieldNames(
const SlSigHierInfo *const sigHierInfo
) const
{
std::vector<std::string> fieldNames(2);
fieldNames[0] = "name";
fieldNames[1] = "elements"
slu::MLStructFieldNameUtil::getUniqueMangledNames(fieldNames, "signal");
return fieldNames;
}
//call step 3
void MLStructFieldNameUtil::getUniqueMangledNames(std::vector<std::string> & names,
const std::string & defPrefix)
{
for(size_t idx=0; idx<numNames; ++idx) {
//Mangle the name
MLStructFieldNameUtil::mangleFieldName(names[idx], defPrefix);
}
...
}
Точка останова находится внутри цикла for шага вызова 3. Когда я проверяюзначения names
на шаге 3 вызова содержат «a» и «b» в векторе вместо «name» и «elements».Однако в окне стека вызовов Visual Studio, когда я проверяю значения внутри fieldNames
, это «имя» и «элементы».
Так что я не понимаю, как это может произойти.Более того, fieldNames
на шаге 2 передается со ссылкой на шаг 3
Я думаю, что значения в fieldNames
шага 1 должны быть случайными значениями, поскольку вызов еще не завершен и еще не возвращен.
Multi-обработка / многопоточность?Но как, вероятно, Muti-processing / Multi-threading может изменить значения в стеке вызовов?