删除CallBack函数中new创建的指针

时间:2012-05-18 13:39:57

标签: c++

我正在做以下事情:

LRESURT CALLBACK WindowProc{
    .......
    Case VK_RETURN:
        int i;
        for ( i = 0; i <1000; i++) {
            int  size = determinesize(i);
            int *pttest = new int[size];
            .....(some work)....
            delete[] pttest;
        }
     ........
}

但是VK_RETURN出现时我遇到了问题。如果我不使用delete[] pttest

我的问题是:我需要删除ptttest吗?当我在google上搜索时,几乎每个人都说每个新的都必须删除。另一个问题是:如果我将VK_RETURN的for循环代码放在函数中,比如void whenvkreturn(),那么我是否需要删除pttest?由于返回后会破坏任何局部变量,我猜这个循环中创建的1000个对象会被自动删除,对吧?我不太了解堆栈,所以我发现的一些解释对我来说并不清楚。

=====

好的,有一个矢量解决方法。但在这种情况下:

TCHAR *text = new text[size];

我应该做什么?

5 个答案:

答案 0 :(得分:1)

您始终需要删除已分配的内存。对于每个,应该有一个删除,即使它在一个函数中。您正在接近的问题可以通过使用动态大小的其他容器(如std :: vector)轻松解决。在本地函数中使用动态容器,它将自动释放自己分配的内存,您不必担心。

答案 1 :(得分:1)

关于你的问题,是的,你需要删除pttest,除非你想故意泄漏内存。基本上,无论何时使用new / new[]分配某些内容,您都应该在以后不再需要它时手动delete / delete[]。< / p>

但是你真的应该考虑使用std::vector而不是使用new[]分配的数组。您不必担心使用delete[]释放内存,std::vector将在其析构函数中自动执行此操作。

答案 2 :(得分:1)

如果保留代码,则不需要使用删除或新内容:

int size = determinesize(i);
std::vector<int> test( size );
.....(some work)....

基于堆栈的解决方案也可以正常工作。如果你想保持原样,那么你当然不会需要来删除pttest,但是你必须在某个时候将其删除并将其从这个开关增加了它无法正常工作并且倾斜的风险。

答案 3 :(得分:1)

在C ++中使用new或new []操作创建指针时,可以在堆中分配内存。即使您在方法中执行此操作也是如此。因此,您需要根据需要使用delete或delete []来释放堆内存。

答案 4 :(得分:1)

作为一项规则,你现在不应该使用新的[],当然也不要删除。而是使用矢量。 为了提高效率,重复使用相同的向量调整大小以避免分配1000个单独的数组:

vector<int> test;

for(int i = 0; i < 1000; ++i) {
    test.resize(determinsize(i));
    ...
}