我刚刚在一些随机崩溃的代码中发现了这个“宝石”。它应该将一个浮点数组分配给bins
,将二进制数分配给nBins
。根据某些条件,有不同的阵列具有不同的大小。当然,这会失败(或者是未定义的行为),因为tmpBins
超出了范围,编译器可以重用其内存。
float* bins = 0;
int nBins = 5;
if (condition1) {
float tmpBins[] = {0.,20.,30.,40.,800.};
bins = tmpBins;
nBins = 5;
} else {
// more cases
}
我想知道如何解决这个问题。我可以使用new
分配内存,并使用memcpy
或循环将其复制。我可以使用向量,但是我没有C ++ 11的向量初始化器,所以我可能不得不用push_back
手动添加元素,我想避免使用它。我宁愿不改变周围遗留代码的太多,所以如果我改变bins
的类型,它仍然可以用作数组的替代品。用C ++解决这个问题的最佳/最理想的方法是什么?
答案 0 :(得分:1)
您确实可以使用std::vector
,您不需要C ++ 11初始值设定项列表才能使其正常工作,只需insert
它们:
std::vector<float> bins;
...
static const float tmpBins[] = {0.,20.,30.,40.,800.};
nBins = sizeof(tmpBins) / sizeof(tmpBins[0]);
bins.insert(bins.end(), tmpBins, tmpBins + nBins);
或者如果您想要替换当前条目:
bins = std::vector<float>(tmpBins, tmpBins + nBins);