解答下指针和数组的问题

mm6688 2009-07-20 03:44:24
#include<iostream.h>
#include<math.h>
#include<string.h>
class CString
{
private:
char*p_str;
public:
CString(char*p_s)
{
p_str=new char [strlen(p_s)+1];
strcpy(p_str,p_s);
}
void print(){cout<<p_str<<endl;}//若将p_str改为*p_str,输出会是abcdef;这是为啥呢?
~CString(){delete[]p_str;}
};
void main()
{
char p[20];
CString *p_strPtr=NULL;

cout<<"Enter a string:";
cin>>p;

CString s1("a string");
p_strPtr=&s1;
p_strPtr->print();//*p_str啥时候指向字符串"a string"
delete p_strPtr;//加上这一行会出现调试错误界面,这是为啥呢?
}

...全文
93 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
pangtaitao 2009-07-20
  • 打赏
  • 举报
回复
p_strPtr=&s1; 这个时候*p_str啥时候指向字符串"a string" ,(确切的说应该是指向Cstring对象)
p_strPtr->print();//*p_str啥时候指向字符串"a string"
delete p_strPtr;//加上这一行会出现调试错误界面,这是为啥呢?
出现错误的原因是p_strPtr与s1都是指向同一块内存,你先用delete p_strPtr,清除个这块内存,然后s1析构的时候又要清除,这样要清除两次当然就报错了。
Hertz_liu 2009-07-20
  • 打赏
  • 举报
回复
[Quote=引用楼主 mm6688 的回复:]若将p_str改为*p_str,输出会是abcdef;这是为啥呢?
[/Quote]
p_str得到的是地址
*p_str得到的是地址存储的值
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 jindan_jinming 的回复:]
void print(){cout < <p_str < <endl;}//若将p_str改为*p_str,输出会是abcdef;这是为啥呢?
p_str为指针,*p_str为指针指向的内容,所以*p_str输出的是指针p_str指向的内容,而p_str输出的是地址值

_strPtr->print();//*p_str啥时候指向字符串"a string"
因为CString s1("a string");
p_strPtr=&s1;
先生成了一个对象s1,会调用拷贝构造函数CString(char*p_s)初始化值这个对象值为"a string",这个时候就已经把"a string"通过strcpy传给*p_str了

delete p_strPtr;//加上这一行会出现调试错误界面,这是为啥呢?
对象的生命周期过后自动调用析构函数~CString(){delete[]p_str;} ,不需要另外delete。
[/Quote]
里面更正一个说法:会调用拷贝构造函数CString(char*p_s)初始化
会调用构造函数CString(char*p_s)初始化!
xiao_ke 2009-07-20
  • 打赏
  • 举报
回复
不是new出来的指针不能delete。 具体的说是: 不是malloc出来的堆内存块首地址是不能free的!
  • 打赏
  • 举报
回复
void print(){cout < <p_str < <endl;}//若将p_str改为*p_str,输出会是abcdef;这是为啥呢?
p_str为指针,*p_str为指针指向的内容,所以*p_str输出的是指针p_str指向的内容,而p_str输出的是地址值

_strPtr->print();//*p_str啥时候指向字符串"a string"
因为CString s1("a string");
p_strPtr=&s1;
先生成了一个对象s1,会调用拷贝构造函数CString(char*p_s)初始化值这个对象值为"a string",这个时候就已经把"a string"通过strcpy传给*p_str了

delete p_strPtr;//加上这一行会出现调试错误界面,这是为啥呢?
对象的生命周期过后自动调用析构函数~CString(){delete[]p_str;} ,不需要另外delete。
tangshuiling 2009-07-20
  • 打赏
  • 举报
回复
好好看看基础的东西再发问吧,p_strPtr=&s1; 这条代码不是告诉你s1与p_strPtr共享一个内存数据吗?
当s1发生析构之时发现p_strPtr已经先一步delete内存数据,因此会产生调试错误界面
mm6688 2009-07-20
  • 打赏
  • 举报
回复
*p_strPtr和*p_str是两个不同的指针吧?
pengzhixi 2009-07-20
  • 打赏
  • 举报
回复
p_strPtr->print();//*p_str啥时候指向字符串"a string"
在你上一句:p_strPtr指向了s1这个对象

delete p_strPtr;//加上这一行会出现调试错误界面,这是为啥呢?
no new no delete
pengzhixi 2009-07-20
  • 打赏
  • 举报
回复
p_strPtr->print();//*p_str啥时候指向字符串"a string"
在你上一句:p_strPtr指向了s1这个对象

delete p_strPtr;//加上这一行会出现调试错误界面,这是为啥呢?
no new no delete

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧