2013-06-03 33 views
0

这是我的第一篇文章,很抱歉,如果没有问好。动态内存删除功能

基本上我有动态内存的麻烦,我想知道这是否是我误解的概念,或功能中的至少一个。好的,所以我使用的是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; 
} 

好了,所以在此之后我就可以读取数据,因此必须连接到指针“数组”,但那么为什么它不会让我删除这些数据,就好像它已经被删除了?

任何意见将不胜感激thanx。

+2

你可以发布原代码,好像你可能会粉碎你的堆栈。 – Geoffrey

+0

该代码不会编译;你在函数声明的参数列表中有'** int val'。 – tmyklebu

回答

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

好的,不好意思记得在将来。 – user2448431

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

+0

我正在写完全一样的东西。唯一我要补充的是,我相信最初的问题是,在double指针之后,通过引用问题vs指针,当您尝试使用delete []时,它可能不是使用数组delete的正确时间,应该有实际上只是删除了,因为你的引用方式,引用方式等等,你甚至无法访问你可以正确调用delete []的指针。 – ChrisCM

+0

哦,我的坏,这是一个错字,但也是一个很好的建议(关于双指针)thanx – user2448431

+0

但我打算删除连接到指针的数据不是指针本身我应该仍然使用只是删除? – user2448431

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风格的数组和动态内存管理基本的和幼稚的实现。有很多改进的机会,但你明白了。

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

因为我们正在处理的指针...返回他们是不是什么大不了的,而且是典型的实践,当你需要动态分配对象的“转移”的所有权。这就是说,引用矢量或其他标准容器的帖子是最好的方法。避免使用新的和删除使代码更安全。

+0

是的,这个问题是我需要从同一个函数返回几个数组。然而,很明显,新的和删除的东西不是很好,我应该将它改为std :: vectors。 – user2448431

+0

我很高兴你已经知道载体更好。我很好奇,但是你认为你的函数与我的“返回几个数组”的观点不同。 – ChrisCM