我正在尝试制作账单及其号码(标识符)。它们的数字是自动生成的,长度为9个字符。
这是我的代码 1 :
#include <iostream>
using namespace std;
int counter = 1234;
char * BillNumber()
{
if (counter == 1)
{
counter++;
return "000000001";
}
int n = 0, c = counter;
while (c != 0)
{
n++;
c /= 10;
}
char * nrBill = new char[n + 1];
_itoa_s(counter, nrBill, n + 1, 10);
nrBill[n + 1] = '\0';
int difference = 9 - n;
if (difference == 0)
return nrBill;
char * helper = new char[difference + 1];
for (int i = 0; i < difference + 1; i++)
{
helper[i] = '0';
if (i == difference)
helper[i] = '\0';
}
strcat_s(helper, 10, nrBill);
counter++;
return helper;
}
int main()
{
char * bill[10];
for (int i = 0; i < 10; i++)
{
bill[i] = BillNumber();
}
for (int i = 0; i < 10; i++)
{
cout << bill[i] << endl;
}
//Deallocation
/*for (int i = 0; i < 10; i++)
{
delete[] bill[i];
}*/
return 0;
}
当我尝试像注释中那样释放内存时,我收到错误。我理解为什么我得到它,我的意思是我甚至没有在main
函数中分配我的记忆。所以我实际上需要在函数BillNumber
中释放它。但我不认为这个功能需要它。
所以我的问题是:
这里实际需要内存释放吗?
1 :我知道我没有使用c ++编码标准,所以请不要抱怨。*
答案 0 :(得分:2)
我的意思是我甚至没有在主函数中分配我的记忆。所以我实际上需要在函数BillNumber中释放它。但我认为这个功能也不需要。
如果分配发生并不重要,关键是如果你分配了什么,你需要解除分配。对于您的代码,因为您仍然在BillNumber()
中调用main()
之后仍在使用指针,您必须稍后在main()
中取消分配它们。
当我尝试在评论中释放内存时,我收到错误。
您需要调试程序以找出真正的问题,这是可能性之一:
char * nrBill = new char[n + 1];
_itoa_s(counter, nrBill, n + 1, 10);
nrBill[n + 1] = '\0';
nrBill[n + 1]
越过了数组的界限。
答案 1 :(得分:1)
因为你正在执行这个char * nrBill = new char[n + 1];
和这个char * helper = new char[difference + 1];
,你实际上是在堆上分配内存,它不会释放,除非你明确地调用它。你应该致电:
delete []nrBill;
delete []helper[];
从函数返回之前,否则会出现内存泄漏。对象nrBill和helper永远不会被释放,直到程序结束,这在你的情况下不是问题,因为它将很快结束,并且内存被恢复,但是如果你开发了一个产生内存泄漏的应用程序并且工作很长一段时间,那将是一个真正的问题。
答案 2 :(得分:0)
首先,当您返回nrBill
时,您不会释放helper
。这是内存泄漏和问题。
至于你的问题,需要内存释放,因为你手动分配了内存。但是在你的情况下不会有任何内存泄漏(除了我上面提到的那个)因为程序完成(主要返回)并且所有分配的内存都被释放了。