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。