char *p = new char; 和 char *p2 = "abcdef"的问题
今天在写代码时,突然间想到一个问题,如果我char *p = new char;出个指针,是否
可以这样操做,对p赋常量字符串呢? p = “abcdef”;
先做个实验:
#include <iostream>
using namespace std;
void main()
{
char* a= new char;
a = "abcde";
cout<<a<<endl;
delete a; // 在这里报内存方法非法
}
在第9行出现错误,为什么呢?~~~
第5行,new 1bit空间 没问题, 第8行delete 也不会有问题
那第7行输出更没有问题了
看来问题只能是第6行了
我们来看看第6行先,
首先char* p = new char;是定义了一个字符指针,new char分配了一个bit的空间,并让p指向这个空间。
而我们在定义一个C语言传统字符串时常用char* a= "abcdef";
因为"abcdef"常量有个系统分配的代表存放这组字符串的匿名首地址,然后把这个地址赋给了a。
由此可见,
a只是个指针而以,它可以指向一个字符,也可以指向一个字符串。在第5行的时候,a指向的是一个一
字节的char,但是在第6行的时候,a已经指向"abcde"了。
所以,
这个例子是一个典行的资源泄露的例子。因为new char了,确没有使用,并由于a在之后已经不指
向这个字符的空间,使之以后都没有机会再被释放掉了,所以这1bit空间就资源泄露了。
总结:
在使用new分配的char型指针空间时,要对其赋值,最好使用memcpy 或strncpy
不建议使用常量字符串赋值