Я пытаюсь построить вектор, и, предположительно, каждый символ * внутри вектора отличается. Вот код:
static char *StatsManager::_statsOption[4] = {"min", "max", "mean", "stddev"};
void BuildStatsNameList(long ChanIdx)
{
for (int m = 0; m < 4; m++)
{
std::string statsName(StatsManager::_statsOption[m]);
for (int n = 0; n < 1; n++)
{
statsName += "_";
statsName += std::to_string(ChanIdx);
statsName += "_";
statsName += std::to_string(n);
//sprintf (statsName, "s%_%d_%d", StatsManager::_statsOption[m],ChanIdx, n);
StatsManager::_statsNameList.push_back((char*)statsName.c_str());
}
}
}
Тем не менее, я заметил, что char*
(statsName
) в statsName
станет тем же самым. Например, после цикла, StatsManager::_statsNameList
становится
stddev_1_0
stddev_1_0
stddev_1_0
stddev_1_0
......
вместо этого я хочу, чтобы это
min_1_0
max_1_0
mean_1_0
stddev_1_0
Кто-нибудь имеет представление о том, как избежать statsName
снова и снова? Благодарю.
Если вы хотите, чтобы строки стиля C сохранялись, одним из вариантов является использование strdup
.
StatsManager::_statsNameList.push_back(strdup(statsName.c_str()));
Обратите внимание, однако, что вам нужно free
память самостоятельно после того, как вы закончите с этими строками.
Поведение вашей программы не определено, поскольку вы получаете доступ к указателям на память, выделенную в функции BuildStatsNameList, которая была освобождена, как только BuildStatsNameList вернется к вызывающей программе.
void BuildStatsNameList(long ChanIdx)
{
for (int m = 0; m < 4; m++)
{
std::string statsName( ...option[m]); // local variable
_statsNameList.push_back( (char*)statsName.c_str()); // no problem so far
}
}
}
// but here _statsNameList holds pointers to invalid memory
Рассмотрите возможность использования std::vector< std::string>
или используйте strdup
который скопирует c-строку для вас в новое место (если вам абсолютно необходимо придерживаться char*
).
char*
вместоstd::string
?