C++内存分配,在这种情况下需要吗?

C++内存分配,在这种情况下需要吗?,c++,pointers,memory-management,C++,Pointers,Memory Management,我在试着制作账单,以及它们的号码识别器。它们的数字是自动生成的,长度为9个字符 这是我的代码1: 当我试图像注释中那样释放内存时,我得到了一个错误。我明白为什么我会得到它,我的意思是我甚至没有在主函数中分配内存。所以我实际上需要在函数BillNumber中取消分配它。但我认为函数中也不需要这样做 所以我的问题是: 这里真的需要内存释放吗 < P > 1:我知道我没有使用C++编码标准,所以请不要抱怨。*< /p> < p>因为你正在做这个char *nrBar =新char [n+1];这个ch

我在试着制作账单,以及它们的号码识别器。它们的数字是自动生成的,长度为9个字符

这是我的代码1:

当我试图像注释中那样释放内存时,我得到了一个错误。我明白为什么我会得到它,我的意思是我甚至没有在主函数中分配内存。所以我实际上需要在函数BillNumber中取消分配它。但我认为函数中也不需要这样做

所以我的问题是:

这里真的需要内存释放吗


< P > 1:我知道我没有使用C++编码标准,所以请不要抱怨。*< /p> < p>因为你正在做这个char *nrBar =新char [n+1];这个char*helper=newchar[difference+1];实际上,您是在堆上分配内存,这不会释放内存,除非您明确地调用它。你应致电:

delete []nrBill; 
delete []helper[]; 

在从函数返回之前,否则将导致内存泄漏。对象nrBill和helper将永远不会被释放,直到程序结束,这在您的情况下不是问题,因为它将很快结束,并且内存将被恢复,但是如果您开发的应用程序产生内存泄漏并且长时间工作,那么这将是一个真正的问题。

首先,当您返回helper时,您不会取消分配nrBill。这是一个内存泄漏和问题

至于您的问题,需要释放内存,因为您已经手动分配了内存。然而,在您的情况下,除了我上面提到的那个之外,不会有任何内存泄漏,因为程序完成了主返回,所有分配的内存都被释放了

我的意思是我甚至还没有在main函数中分配内存。所以我实际上需要在函数BillNumber中取消分配它。但我认为函数中也不需要这样做

分配发生在哪里并不重要,关键是如果你分配了一些东西,你需要取消分配。对于您的代码,因为您仍在使用main中调用的BillNumber之后的指针,所以必须稍后在main中取消分配它们

当我试图像注释中那样释放内存时,我得到了一个错误

您需要调试程序以找出真正的问题,以下是一种可能性:

char * nrBill = new char[n + 1];
_itoa_s(counter, nrBill, n + 1, 10);
nrBill[n + 1] = '\0';

nrBill[n+1]正在脱离数组的界限。

您的代码充满了bug。而且这不是一个调试服务,尽管表面上是这样。为什么你认为不需要内存释放呢?任何时候用new分配内存时,都必须用delete解除分配。规则很简单。你可以通过使用RAII和标准C++习语来简化它,但是你似乎有一些理由避免这些。“CordyGooy,我现在知道我需要在我的函数中释放NRBARP,但是我怎样才能释放助手呢?”我的意思是我不能做像这样的事情:删除[]助手;返回助手@Kapobajza您返回指向helper的指针并将其存储在bill中,所以您只需要在bill中取消分配它。对,您不能这样做。这就是为什么C++程序员使用对象来封装数据,这样他们就不必做手动内存管理。如果您想用C方式进行,那么您将从BillNumber返回一个指针,该指针将helper的所有权从调用的函数BillNumber转移到调用的函数main。调用函数main现在有责任在使用完[]helper后删除它。我知道我需要删除[]nrBill,但是如果我删除[]helper,我将如何返回它?我无法返回空字符指针。请在主函数中调用delete[]helper,抱歉!还有你给它起的名字,比如delete[]bill。
char * nrBill = new char[n + 1];
_itoa_s(counter, nrBill, n + 1, 10);
nrBill[n + 1] = '\0';