读书人

字符指针的疑惑解决思路

发布时间: 2012-04-22 18:34:46 作者: rapoo

字符指针的疑惑
为什么

[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 就要有[];好像不加也可以?但是这只是好像,实际上就是不可以.请问有证据吗?

读书人网 >C++

热点推荐