注册 登录
编程论坛 VC++/MFC

求助,高手看一下我的程序那里错了!!!

zhiyajun11 发布于 2010-12-22 23:39, 602 次点击
本人用的是vs2010,下面是代码:
#include <iostream>
#include <string.h>
using namespace std;
class CDemo
{
public:
    CDemo(char *s)
    {
        ps=new char(strlen(s)+1);
        strcpy(ps,s);
    }
    ~CDemo()
    {
        if(ps) delete[] ps;
    }
    void print()
    {
        cout<<ps<<endl;
    }
    CDemo& operator =(CDemo &a)
    {
        if(ps) delete[] ps;
        if(a.ps){
            ps=new char(strlen(a.ps)+1);
            strcpy(ps,a.ps);
        }
        else ps =0;
        return *this ;
    }
private:
    char *ps;
};
void main()
{
    CDemo d1("Key"),d2("Mouse");
    d1=d2;
    d1.print();
}
没有语法错误,可以运行就显示错误。谢谢了!!!
7 回复
#2
dotaluna2010-12-23 01:00
不知道你为什么要这么设计,问题出在指针的释放上
 if(ps)
         delete []ps;
#3
dotaluna2010-12-23 01:00
不知道你为什么要这么设计,问题出在指针的释放上
 if(ps)
         delete []ps;
#4
yuccn2010-12-23 09:43
犯了低级错误:
CDemo(char *s)
    {
        ps=new char(strlen(s)+1);
        strcpy(ps,s);
    }

这个改成:
CDemo(char *s)
    {
        ps=new char[strlen(s)+1];
        strcpy(ps,s);
    }
就行了,不过还是建议你在ps=new char[strlen(s)+1];之后初始化一下:
memset(ps, 0, sizeof(char) * (strlen(s)+1));
养成一个良好的习惯
#5
yuccn2010-12-23 09:49
设计的时候,应该考虑多一点,如果构造函数的时候:CDemo d1(NULL);会出现什么情况?好的设计,应该有容错处理
#6
zhiyajun112010-12-23 13:07
回复 5楼 yuccn
呵呵呵,谢谢啦,那个new char后面跟小括号和跟中括号有什么区别吗,这个问题我还是不太懂。。。希望解释一下,谢谢了!

#7
yuccn2010-12-23 17:55
你可以设想一下
int *pInt = new int[10];
就是申请了十个int的空间

int *pInt = new int(10);
则为 :
int *pInt = new int
 *pInt = 10;
同理
ps=new char(strlen(s)+1);
---》 ps = new char
  *ps = strlen(s)+1;
也就是把strlen(s)+1 的ASCII码对应的值赋给了ps;

ps:
ps=new char(strlen(s)+1);实际你只申请了一个char
 
#8
zhiyajun112010-12-23 22:24
回复 7楼 yuccn
恩,简单明了,原来是这样,呵呵,谢谢啦!!!
1