最近在做项目的时候,调用了很多第三方的API, 这些API 有很多返回char *, const char *, 有时需要delete 返回的字符串,有时不能,一删则错,晕,这有什么规则吗?
让我们先看看几个例子
// Return Pointer.cpp : Defines the entry point for the console application.
//
#include \"stdafx.h\"
#include \"stdlib.h\"
#include \"string.h\"
//Array
char* test1()
{
char p[] = \"test\"; //静态存储区上,可以被修改,不是堆上,所以不能delete掉
return p;
}
const char* test2()
{
const char p[] = \"test\"; //const变量, 全局数据
return p;
}
char* test3()
{
static char p[] = \"test\"; //静态存储区上
return p;
}
//pointer to const
char* test4()
{
char *p = \"test\"; //p指向常量字符串,返回字符串指针不能被编辑
return p;
}
const char* test5()
{
const char *p = \"test\"; //指向常量的指针
return p;
}
char* test6()
{
static char p = ’t’; //static, 全局数据
return &p;
}
char* test7()
{
return \"test\"; //常量
}
//pointer to heap
char* test8()
{
char *p= new char[10]; //heap
strcpy(p, \"test\");
return p;
}
const char* test9()
{
char *p= new char[10]; //heap
strcpy(p, \"test\");
return p;
}
char* test10()
{
static char *p = new char[10]; //heap
strcpy(p, \"test\"); [Page]
return p;
}
int _tmain(int argc, _TCHAR* argv[])
{
//Array
char *str1 = test1();
*str1 = ’T’;
//delete str1;
const char *str2 = test2();
//*str2 = ’T’;
//delete str2;
char *str3 = test3();
*str3 = ’T’;
//delete str3;
//pointer to const
char *str4 = test4();
//*str4 = ’T’;
//delete str4;
const char *str5 = test5();
//*str5= ’T’;
//delete str5;
char *str6 = test6();
*str6 = ’T’;
//delete str6;
char *str7 = test7();
//*str7 = ’T’;
//delete str7;
//pointer to heap