char *p = new char; 和 char *p2 = "abcdef"的区别

来源:互联网 发布:苹果微信网络连接失败 编辑:程序博客网 时间:2024/05/18 00:06

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

不建议使用常量字符串赋值

原创粉丝点击