我正在尝试构建一个向量,并且据说向量中的每个char *都是不同的。这是代码:
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
一次又一次被覆盖?感谢。
答案 0 :(得分:4)
程序的行为未定义,因为您正在访问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*
)。
答案 1 :(得分:3)
如果你想要持久的C风格字符串,一个选项就是使用strdup
。
StatsManager::_statsNameList.push_back(strdup(statsName.c_str()));
但请注意,完成这些字符串后,您需要自己free
内存。