C 内存DEADLOCATION,在这种情况下需要它



我正在尝试制作账单及其数字(标识符)。它们的数字自动生成,并且长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] = '';
    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] = '';
    }
    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中进行处理。但是我认为功能也不需要。

所以我的问题是:

在这里实际上需要内存DealLocation吗?

1 :我知道我不使用C 编码标准,所以请不要抱怨。*

我的意思是我什至没有将内存分配给主函数。因此,我实际上需要在功能广告函数中进行处理。但是我认为功能也不需要。

如果分配发生并不重要,关键是如果您分配了某些内容,则需要对其进行处理。对于您的代码,因为在main()中调用BillNumber()之后仍在使用指针,因此您必须在main()中进行审理。

当我尝试像评论一样对内存进行处理时,我会收到错误。

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

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

nrBill[n + 1]从数组中脱颖而出。

因为您正在执行此char * nrBill = new char[n + 1];,并且此char * helper = new char[difference + 1];实际上是在堆上分配内存,除非您明确称呼它,否则该内存不会释放。您应该致电:

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

从功能返回之前,否则您将获得内存泄漏。对象NRBILL和HERPER永远不会被释放,直到程序结束为止,在您的情况下,这不是问题,因为它将很快结束并且记忆恢复,但是如果您开发了产生内存泄漏的应用程序的应用程序并且正在长时间工作,然后这将是一个真正的问题。

首先,当您返回 helper时,您不批准nrBill。这是记忆泄漏和问题。

至于您的问题,需要内存交易,因为您已经手动分配了内存。但是,在您的情况下,不会有任何内存泄漏(除了上述我提到的记忆),因为程序完成(主要退货)和所有分配的内存都可以释放。

最新更新