2016-06-25 121 views
-3

我正在尝试制作账单及其编号(标识符)。他们的号码是自动生成的,长度为9个字符。C++内存释放,在这种情况下是否需要?

这里是我的代码:

#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中释放它。但我认为这在功能上也不需要。

所以我的问题是:

是内存释放实际上需要在这里?

:我知道,我没有使用C++编码标准,所以请不要抱怨说*

+3

你的代码充满了bug。尽管出现,这不是一项调试服务。 – juanchopanza

+6

你为什么认为不需要内存释放?任何时候你用'new'分配内存,你必须用'delete'来释放内存。规则很简单。通过使用RAII和标准C++习惯用法,你可以使它变得更简单,但是你似乎有理由避免这些习惯。 –

+0

@CodyGray好吧,我现在知道我需要在我的函数'BillNumber()'中释放'nrBill',但是我怎样才能释放'helper'?我的意思是我不能这样做:'delete [] helper;返回帮助程序;' – Kapobajza

回答

1

因为你正在做这个char * nrBill = new char[n + 1];,这char * helper = new char[difference + 1];你实际上是在堆中分配内存。 ,除非你明确地调用它,否则它不会释放。你应该打电话:

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

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

+0

我知道我需要'删除[] nrBill',但是如果我做了'delete [] helper',我将如何返回它呢?我无法返回空字符指针。 – Kapobajza

+0

delete []助手应该在你的主函数中调用,对不起!用你在那里给它的名字,像delete [] bill。 – meJustAndrew

0

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

至于你的问题,需要内存释放,因为你已经手动分配内存。然而,在你的情况下,不会有任何内存泄漏(不包括我之前提到的那个),因为程序结束(主返回)并且所有分配的内存都被释放。

2

我的意思是我甚至没有在主函数中分配我的记忆。所以我实际上需要在函数BillNumber中释放它。但我认为这在功能上也不需要。

如果分配发生并不重要,问题是如果您分配了某些内容,则需要将其分配。对于你的代码,因为你仍然使用在main()中调用的BillNumber()之后的指针,所以你必须在main()以后再释放它们。

当我尝试释放内存像在评论中,我得到一个错误。

你需要对程序进行调试,以找出真正的问题,这里的可能性之一:

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

nrBill[n + 1]是失控的约束阵列。

相关问题