字符指针的疑惑解决思路
字符指针的疑惑为什么[codeC/C++]1.char *pp Hello2.char *p new char[10]p Hellodelete [
字符指针的疑惑 为什么 [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申请的空间[解决办法]
探讨 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 也没有区别?
[解决办法] 探讨 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 ::……[解决办法] char *p = new char[10]; (这里p指向地址为1, 动态内存,需要释放)
p = "Hello"; (这里p指向地址为2, 静态存储区,不需要释放)
delete [] p; (所以崩溃)
static变量又是在是静态存储区
[解决办法] 探讨 #include <iostream> using namespace std; class Test { public: Test(){} ~Test(){} int GetInt() { return ival; } private: static int ival; int k; }; int Test::ival = 7; //这句为什么是可以的?……[解决办法] 探讨 我指的是在字符指针的情况下,是否delete p(这里P是由new关键字返回的字符指针)也可以将new申请的内存归还给系统?也就是不加[]和加[]有区别吗?我认为是没有区别的啊。 new 后面有[] ,delete 就要有[];好像不加也可以?但是这只是好像,实际上就是不可以.请问有证据吗?