函数内的动态内存删除

时间:2013-06-03 15:27:58

标签: c++ pointers memory dynamic

这是我的第一篇文章,很抱歉,如果没有问好。

基本上我遇到了动态内存的麻烦,我想知道是不是我误解了这个概念,或者至少是其中一个功能。好的,所以我正在使用C ++,我需要管理一个在主程序循环中改变大小的数组,但是当我尝试删除内存时,我不断收到堆错误。 (下面是我正在尝试做的简化版本。)

void main(void)
{
  //Initialization

  //main loop
  while(true)
  {
    int* array;
    function(&array);

    printf("test %d",array[0]); //basically use the data

    delete [] array;
  }
}

//in separate file

void function(**int val)
{
   *val=new int[size of array] // i pass the size of the array...
                               //to the function as well
   //fill the array with data
   return;
}

好的,所以在此之后我可以读取数据,所以它必须附加到指针“数组”但是为什么它不允许我删除数据,好像它已被删除?

任何建议都会受到高度赞赏。

4 个答案:

答案 0 :(得分:3)

不是主要问题,但实际上你的语法错误,

void function(**int val);

应该是:

void function(int **val);

但是你不需要双指针,因为你只需通过引用传递指针:

void function(int *&val);

因此你的程序应该是这样的:

int main() // main should return int
{
    int *array;
    function(array, 5);

    printf("test %d", array[0]);

    delete [] array;
}

void function(int *&val, int size)
{
   val = new int[size];
}

您也不需要while (true)循环。

答案 1 :(得分:2)

你说“任何建议”都受到欢迎,所以这是我的建议:

首先不要使用C风格的数组,这不会有问题。改为使用vector

#include <vector>
#include <algorithm>

void main(void)
{
  //Initialization

  //main loop
  while(true)
  {
      std::vector <int> array;
      function (array);
      printf ("test %d", array[0]);
  }
}

//在单独的文件中

void function(std::vector <int>& vec)
{
  vec.push_back (1);
  vec.push_back (2);
  // ...etc...
}

上面是一个基本的,天真的实现,它使用vector而不是C风格的数组和动态内存管理。有很多改进的机会,但你明白了。

答案 2 :(得分:0)

您的代码在当前状态下应该工作。但是,使用newdelete就是非常糟糕的做法,尤其是在不同的地方使用新/删除

您应该使用std::vector代替:

// main function 
std::vector<int> array = function();

printf("test %d",array[0]); //basically use the data

你的函数()将是:

std::vector<int> function()
{
  std::vector<int> val(size);
  //fill the array with data
  return val;
}

答案 3 :(得分:0)

另一个想法。通过引用传递的值是大对象的复制成本。有了指针,您无需担心这一点。这段代码也可以像这样清理。

int main() // main should return int
{
    int *array = function(SOME_SIZE);

    printf("test %d", array[0]);

    delete [] array;
}

int * function(int size) //Just return the pointer
{
   int *temp = new int[size];
   return temp;
}

由于我们正在处理指针...返回它们并不是什么大问题,而且当您需要“转移”动态分配对象的所有权时,这是典型的做法。话虽如此,使用矢量或其他标准容器引用的帖子是最好的方法。避免使用new和delete会使代码更安全。