当调用函数修改指针如何释放内存?

时间:2015-12-24 03:35:57

标签: c++ pointers memory free

我需要编写一个以数组作为输入的函数,并且需要在每次函数调用时移动数组的头部,以简单地显示我的问题,我设计了以下简单示例:

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]。在这种情况下,有没有办法释放记忆?

1 个答案:

答案 0 :(得分:3)

您提出的问题的答案是,您需要保存new结果的副本,并将其删除:

FLOAT** testVec = new FLOAT*[2];
FLOAT** savedVec = testVec;
....
for (size_t i = 0; i < 2; ++i)
    delete [] savedVec[i];
delete [] savedVec;

然而,这对你自己来说非常非常困难。在C ++中,您几乎总是希望使用std::vectorstd::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的声明和实施也需要改变。

最终评论:每次围绕for循环从0到3都需要重置testVec。否则,第二次循环它会指向数组的末尾。