我是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 其他答案没有回答我的确切问题。
答案 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;
}