这是我的第一篇文章,很抱歉,如果没有问好。
基本上我遇到了动态内存的麻烦,我想知道是不是我误解了这个概念,或者至少是其中一个功能。好的,所以我正在使用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;
}
好的,所以在此之后我可以读取数据,所以它必须附加到指针“数组”但是为什么它不允许我删除数据,好像它已被删除?
任何建议都会受到高度赞赏。
答案 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)
您的代码在当前状态下应该工作。但是,使用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;
}
答案 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会使代码更安全。