c++你牛!!强人快来

来源:百度知道 编辑:UC知道 时间:2024/05/29 19:09:03
#include<iostream>
using namespace std;
int main()
{

char *p=new char[6];
p="abcdef";
cout<<p<<endl;
delete []p;

return 0;
}

这个为什么运行时不能结束?当去掉delete语句却行了,为什么?

new和delete是在堆区上分配和释放内存。
char *p=new char[6];在堆区上分配一个有6个元素的char型数组,p="abcdef";是将栈区的字符串“abcdef”首地址给p,然后delete []p;释放堆区的内存,可上一条语句已经将指针指向字符串首地址,即栈区了,delete只能释放堆区内存,而p指向了栈区,所以程序运行时会崩溃。
动态分配一个对象空间有三种方式:
1,int *p=new int; delete p;
2,int *p=new int(4); delete p;
3,int *p=new int[5]; delete []p;
这前两种都是可以初始化的。只有第三种,如果是类类型的话可以调用对象的构造函数来初始化,比如:
string *p=new string[10];这时会调用string的构造函数(参考一下类中构造函数的用法),如果是普通的类型的话,就无法初始化了。所以在使用的时候要小心,可以一个一个的赋值。
char *p=new char[6];
p[0]='a';
p[1]='b';
p[2]='c';
p[3]='d';
p[4]='e';
p[5]='f';
for (int i=0;i<6;i++)
{
cout<<p[i];
}
cout<<endl;
delete []p;

//有几处错误:
//1 new后你用p=""赋值,这样p就指向""这个地址了,不是你new出来的了,所以不能delete[]了.
//2你new char[6]赋值abcdef,应该new char[7]要不没有'\0'的位置了,还会有错误的.或是值给abcde
//如下是我修改了后的代码.

#include<ios