字符指针的疑惑
为什么
[code=C/C++]
1. char *p;
p = "Hello";
2. char *p = new char[10];
p = "Hello";
delete [] p;
为什么1中赋值是可以,而2中运行到delete的时候就由问题了啊?
另外由new分配的字符串内存空间到底要不要再delete后加[],怎么好像不加也可以啊?
还有什么是静态存储区,这里的“Hello”是分配在静态存储区的吗?和全局区有什么区别?而static变量又是在什么区分配的内存?是静态存储区?还是全局区?
[解决办法]
为什么1中赋值是可以,而2中运行到delete的时候就由问题了啊?
====
delete 的必须是new 返回的那一个值,你这里中途改变了那个指针的值.
==
另外由new分配的字符串内存空间到底要不要再delete后加[],怎么好像不加也可以啊?
====
new 后面有[] ,delete 就要有[];好像不加也可以?但是这只是好像,实际上就是不可以.
==
还有什么是静态存储区,这里的“Hello”是分配在静态存储区的吗?和全局区有什么区别?而static变量又是在什么区分配的内存?是静态存储区?还是全局区?
========
字符串字面量("hello"等), 全局变量,静态变量,都是在静态存储区的.
[解决办法]
char *p = new char[10];
p = "Hello"; // 指针脱钩了,不再指向原来new申请的空间
[解决办法]
[解决办法]
C++标准的规定:
5.3.5 Delete [expr.delete]
1 The delete-expression operator destroys a most derived object (1.8) or array created by a new-expression.
delete-expression:
::opt delete cast-expression
::opt delete [ ] cast-expression
The first alternative is for non-array objects, and the second is for arrays.
========
你之所以认为无区别,无非是因为编译器没有报错.
你不用delete 编译器也不会报错,那么用不用delete 也没有区别?
[解决办法]
[解决办法]
char *p = new char[10]; (这里p指向地址为1, 动态内存,需要释放)
p = "Hello"; (这里p指向地址为2, 静态存储区,不需要释放)
delete [] p; (所以崩溃)
static变量又是在是静态存储区
[解决办法]
[解决办法]