2016-06-25 120 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]是失控的約束陣列。

相關問題