我需要编写一个以数组为输入的函数,并且需要在每次函数调用时移动数组的头部,为了简单地说明我的问题,我设计了以下简单的示例:
void testFunc(FLOAT* &testVec)
{
std::cout << " testVec " << *testVec << "n";
++testVec;
}
在main()
中,我有:
FLOAT** testVec;
testVec = new FLOAT*[2];
for (int i = 0; i < 2; ++i)
testVec[i] = new FLOAT[3];
testVec[0][0] = 1.0; testVec[0][1] = 2.0; testVec[0][2] = 3.0;
testVec[1][0] = 4.0; testVec[1][1] = 5.0; testVec[1][2] = 6.0;
for (int j = 0; j < 3; ++j){
for (int i = 0; i < 2; ++i){
testFunc(testVec[i]);
}
}
这段代码运行良好,并按照我的预期打印出从1.0到6.0的值。但是,我不知道如何删除testVec
,因为函数正在更改testVec[i]
。在这种情况下,有没有办法释放内存?
问题的答案是,您需要保存new
结果的副本,并删除:
FLOAT** testVec = new FLOAT*[2];
FLOAT** savedVec = testVec;
....
for (size_t i = 0; i < 2; ++i)
delete [] savedVec[i];
delete [] savedVec;
然而,这让你自己的生活变得非常、非常、艰难。在C++中,您几乎总是希望使用std::vector
或std::array
,而不是new和delete。你可能会使用:
std::vector<std::array<FLOAT,3>> testVec(2); // A two element vector of
// three element arrays.
或
std::vector<std::vector<FLOAT>> testVec(2); // A two element vector
// of vectors:
for (auto &element : testVec) element.resize(3); // Resize each element
您对testFUNC
的声明和实现也需要更改。
最后一句话:每次从0到3的for循环都需要重置testVec
。否则,第二次循环时,它指向数组的末尾。