功能无需删除动态数组即可运行。程序有效并且没有错误

时间:2016-05-23 10:36:22

标签: c++ arrays dynamic delete-operator

我是C ++的学生和初学者。在课堂上我们正在练习指针,动态数组和函数。我写了一个没有错误的程序,并做了它必须做的事情。我的问题是它可以在不删除动态数组的情况下工作。 我们被要求将delete []放在函数

#include <iostream>
using namespace std;

char* Function (char c[], int numbers[]){
    int k=0;

    for ( int i=0; i< 4;i++){
        k+=numbers[i];
    }

    k++;
    char *result = new char[k];
    char *counter=result;

    for ( int i=0; c[i]!='\0';i++)
    {
        int index = numbers[i];

        for (int j=0; j< index; j++)
        {
            *counter=c[i];
            counter=counter+1;
        }
     }

     *counter='\0';

     return result;

 }

int main ()
{
    char c[]="abcd";
    int numbers []={1,2,3,4};
    char d[]="ghj";
    int numbersx []={2,1,1};

    cout << Function(c,numbers);
    cout << Function(d,numbersx);

    return 0;   
 }

我不清楚在这种情况下delete []的位置。 我搜索了this recommends that i put the delete inside main 其他答案没有回答我的确切问题。

3 个答案:

答案 0 :(得分:0)

可以在函数中删除它。只是不要再次释放/删除它。您也可以在main()中删除它。

如果你不删除它,你就不会遇到明显的问题(编译器会赢得抱怨,程序也不会崩溃)。但是你会有内存泄漏,这绝对不是你想要的。

答案 1 :(得分:0)

  

我的问题是它可以在不删除动态数组的情况下工作。

它可能会起作用......但它也会泄漏内存。在没有无限内存的计算机上,内存泄漏是一件坏事。

  

我不清楚在这种情况下delete []的位置。

必须将其定位,以便在删除指向对象后永远不会使用在这里使用意味着访问对象的内存,例如通过解除引用它的指针。

  

如果我在退货后把它放进去还会被删除吗?

如果你的意思是它在Function但在返回之后,当然不是。返回后,函数中没有任何内容被执行。

  

必须放在函数中而不是main中。

如果您要在Function中删除,那么您将返回一个指向已删除对象的指针,这将非常糟糕。我建议放弃这个愚蠢的要求。

从技术上讲,main从不取消引用指针,因此即使你在Function中删除了,程序在技术上仍然会有明确定义的行为,即使返回值完全没用。

答案 2 :(得分:0)

如果不释放内存,最终会导致内存泄漏。对于像这样的简单应用程序,您不太可能看到问题。对于在应用程序退出之前分配大量数据的较大/较长时间运行的应用程序,最终会耗尽内存并且程序将崩溃和/或操作系统在将数据分页到磁盘时会慢慢爬行

要释放内存但仍然打印一些输出,你需要这样的东西:

#include <iostream>
using namespace std;

void Function (char c[], int numbers[]){
    int k=0;

    for ( int i=0; i< 4;i++){
        k+=numbers[i];
    }

    k++;
    char *result = new char[k];
    char *counter=result;

    for ( int i=0; c[i]!='\0';i++)
    {
        int index = numbers[i];

        for (int j=0; j< index; j++)
        {
            *counter=c[i];
            counter=counter+1;
        }
    }

    *counter='\0';

    cout << result;

    delete [] result;
 }

int main ()
{
    char c[]="abcd";
    int numbers []={1,2,3,4};
    char d[]="ghj";
    int numbersx []={2,1,1};

    Function(c,numbers);
    Function(d,numbersx);

    return 0;   
}

这是你在函数中获得delete[]的唯一方法,因为正如其他人所说,你仍然需要访问内存来报告函数返回后的结果。

另一种方法是在main方法中调用delete []两次,如下所示:

#include <iostream>
using namespace std;

char* Function (char c[], int numbers[]){
    int k=0;

    for ( int i=0; i< 4;i++){
        k+=numbers[i];
    }

    k++;
    char *result = new char[k];
    char *counter=result;

    for ( int i=0; c[i]!='\0';i++)
    {
        int index = numbers[i];

        for (int j=0; j< index; j++)
        {
            *counter=c[i];
            counter=counter+1;
        }
    }

    *counter='\0';

    return result;
}

int main ()
{
    char c[]="abcd";
    int numbers []={1,2,3,4};
    char d[]="ghj";
    int numbersx []={2,1,1};

    char* result = Function(c,numbers);
    cout << result;
    delete[] result;

    result = Function(d,numbers);
    cout << result;
    delete[] result;

    return 0;   
}