函数内的动态内存删除
Dynamic memory deletion within functions
这是我的第一个帖子,如果你问得不好,我很抱歉。
基本上我在动态记忆方面遇到了麻烦,我想知道是否我误解了这个概念,或者至少是其中一个功能。好吧,所以我使用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风格的数组和动态内存管理的基本和朴素的实现。有很多改进的机会,但你知道的。
您的代码,在其当前状态下,应该工作。然而,像这样使用new
和delete
是非常糟糕的做法,特别是在不同的地方使用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使代码更安全。
相关文章:
- 迭代时从向量和内存中删除对象
- 为什么示例代码访问IUnknown中已删除的内存
- 我们可以删除链表中静态内存中的节点吗
- 在c++中删除内存失败
- 如何在cpp中删除(免费)多维结构内存?
- 如何删除列出的"QGraphicsPathItem"对象以控制进程内存使用情况?
- 一种从内存中删除 UTF 字节的方法?
- 内存泄漏如何查找和删除
- 擦除是否删除 stl 无序列图元素使用的堆内存
- 无法删除布尔动态内存分配
- 删除类成员的动态分配内存的最佳方法是什么
- 如何控制或优化或删除或释放 UNION 中未使用的内存
- 避免在使用链接列表从 deque 中删除最后一个节点时出现内存泄漏
- 为什么删除分配的阵列会导致内存错误?
- 删除指针后内存泄漏
- 提升进程间共享内存删除、权限和输出文件
- 升级分解共享内存删除对象而无需销毁
- C++内存:删除未使用的布尔数组可以将结果从正确更改为错误
- 函数内的动态内存删除
- 内存删除的运行时检测