C++我爱编程

C++ 用函数申请一块内存

2018-04-13  本文已影响21人  FlyingPenguin

一种典型的使用错误

int getbuffer(char *out_szBuffer)
{
    if (NULL == out_szBuffer)
    {
        out_szBuffer = new (std::nothrow) char[1024];
        if (NULL == out_szBuffer)
        {
            return -1;
        }
    }

    return 0;
}

...

    char *szBuffer = NULL;
    int nRet = getbuffer(szBuffer);
    if (nRet == 0)
    {
        strcpy(szBuffer, "Hello World!!"); // 这里会崩溃 因为szBuffer是NULL的
        printf(szBuffer);
    }

int getbuffer(char *out_szBuffer)函数传入的是NULL, 返回的也是NULL.

正确使用方式

int getbuffer(char **out_szBuffer)
{
    if (out_szBuffer)
    {
        (*out_szBuffer) = new (std::nothrow) char[1024];
        if (NULL == (*out_szBuffer))
        {
            return -1;
        }
    }

    return 0;
}

int releasebuffer(char **out_szBuffer)
{
    if (out_szBuffer)
    {
        delete [] (*out_szBuffer);
        (*out_szBuffer) = NULL;
    }

    return 0;
}

...
    char *pszBuffer = NULL;
    printf("#1 addr of &pszBuffer : 0x%p\n", &pszBuffer);
    int nRet = getbuffer(&pszBuffer);
    printf("#2 addr of &pszBuffer : 0x%p\n", &pszBuffer);
    if (nRet == 0)
    {
        strcpy(pszBuffer, "Hello World!!\n"); 
        printf(pszBuffer);
    }

    releasebuffer(&pszBuffer);
    printf("#3 addr of &pszBuffer : 0x%p\n", &pszBuffer);

运行结果:


结果

其实这也不是一种良好的使用习惯,因为如果程序员没有释放,会造成内存泄漏的问题
这里只是一个语言练习的小demo。

上一篇下一篇

猜你喜欢

热点阅读