【发布时间】:2023-03-29 12:18:01
【问题描述】:
我正在尝试制作账单及其编号(标识符)。它们的编号是自动生成的,长度为 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++ 编码标准,所以请不要抱怨。*
【问题讨论】:
-
您的代码充满了错误。这不是一个调试服务,尽管看起来。
-
为什么你认为不需要内存释放?任何时候使用
new分配内存时,都必须使用delete解除分配。规则很简单。您可以使用 RAII 和标准 C++ 习惯用法使其更简单,但您似乎有理由避免使用这些。 -
@CodyGray 好吧,我现在知道我需要在我的函数
BillNumber()中取消分配nrBill,但是我该如何取消分配helper?我的意思是我不能这样做:delete[] helper; return helper; -
@Kapobajza 您将指针返回到助手并将其存储在账单中,因此您只需在账单中释放它。
-
对,你不能那样做。这就是为什么 C++ 程序员使用对象来封装数据,这样他们就不必手动进行内存管理了。如果您想以 C 方式执行此操作,则从
BillNumber()返回一个指针,它将helper的所有权从被调用函数 (BillNumber) 转移到调用函数 (main)。调用函数main现在对delete[] helper使用完毕后负责。
标签: c++ pointers memory-management