0

我正在执行以下操作:

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

=====

好的,有一个矢量解决方法。但是当它是这种情况时:

TCHAR *text = new text[size];

我应该怎么做?

4

5 回答 5

1

您总是需要删除分配的内存。对于每个new都应该有一个delete,即使它在一个函数中。您正在解决的问题可以通过使用其他具有动态大小的容器轻松解决,例如 std::vector。在本地函数中使用动态容器,它会自动释放自己分配的内存,你不用担心。

于 2012-05-18T13:45:01.403 回答
1

关于您的问题,是的,您需要 delete pttest,除非您想故意泄漏内存。基本上,每当您使用new/分配某些东西时new[],您应该在以后不再需要它时手动delete/它。delete[]

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

于 2012-05-18T13:45:18.420 回答
1

如果您保留代码原样,那么您不需要使用 delete 或 new :

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

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

于 2012-05-18T13:47:17.847 回答
1

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

于 2012-05-18T13:53:25.060 回答
1

作为一项规则,这些天你永远不应该使用 new[] ,当然也不应该删除。而是使用矢量。为了获得额外的效率点,重用相同的向量调整它的大小以避免分配 1000 个单独的数组:

vector<int> test;

for(int i = 0; i < 1000; ++i) {
    test.resize(determinsize(i));
    ...
}
于 2012-05-18T15:58:01.050 回答