函数内的动态内存删除

Dynamic memory deletion within functions

本文关键字:内存 删除 动态 函数      更新时间:2023-10-16

这是我的第一个帖子,如果你问得不好,我很抱歉。

基本上我在动态记忆方面遇到了麻烦,我想知道是否我误解了这个概念,或者至少是其中一个功能。好吧,所以我使用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;
}

Ok,所以在这之后,我可以读取数据,所以它必须附加到指针"数组",但为什么它不允许我删除数据,如果它已经被删除了?

这不是主要问题但你的语法有问题,

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)循环。

你说"任何建议"都是受欢迎的,所以我的建议是:

首先不要使用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风格的数组和动态内存管理的基本和朴素的实现。有很多改进的机会,但你知道的。

您的代码,在其当前状态下,应该工作。然而,像这样使用newdelete是非常糟糕的做法,特别是在不同的地方使用new/delete 。

你应该用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;
}

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

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;
}

因为我们在处理指针…返回它们不是什么大事,当您需要"转移"动态分配对象的所有权时,这是典型的做法。话虽如此,引用vector或其他标准容器的帖子是最好的方法。避免使用new和delete使代码更安全。