请教:C++中成员指针变量如何初始化才不会出错呢,比如这个
#include<iostream>usingnamespacestd;#include<string.h>classpointer{public:char*p;poin...
#include<iostream>
using namespace std;
#include<string.h>
class pointer
{
public:
char *p;
pointer():p("Gavin")
{
char *p=new char[6];
}
~pointer()
{
delete p;
}
};
void main()
{
pointer x;
cout<<x.p<<endl;
}
为什么能通过可是运行时会报错呢,我猜想是指针越位的问题,可是应该怎么改?谢了 展开
using namespace std;
#include<string.h>
class pointer
{
public:
char *p;
pointer():p("Gavin")
{
char *p=new char[6];
}
~pointer()
{
delete p;
}
};
void main()
{
pointer x;
cout<<x.p<<endl;
}
为什么能通过可是运行时会报错呢,我猜想是指针越位的问题,可是应该怎么改?谢了 展开
2个回答
展开全部
char *p;
pointer():p("Gavin")
{
char *p=new char[6];
}
注意,成员变量的p和你申请内存的p不是同一个
你成员变量的p用初始化列表初始化的,指向了gavin,
你申请内存的p是临时变量,出了括号就释放了,内存虽在,但是没有指针指向它了,无法释放了
析构函数里面释放p不合法,因为你已经让它指向了常量字符串,改法
pointer()
{
p=new char[6];
memset(p,0,6);
strcpy(p,"Gavin");
}
pointer():p("Gavin")
{
char *p=new char[6];
}
注意,成员变量的p和你申请内存的p不是同一个
你成员变量的p用初始化列表初始化的,指向了gavin,
你申请内存的p是临时变量,出了括号就释放了,内存虽在,但是没有指针指向它了,无法释放了
析构函数里面释放p不合法,因为你已经让它指向了常量字符串,改法
pointer()
{
p=new char[6];
memset(p,0,6);
strcpy(p,"Gavin");
}
追问
你给的方法虽然是能解决这个问题,可是我们平时老师讲的是用初始化符表的方法对指针进行初始化,memset函数我们都不会用,能不能以初始化符表的方式对它初始化并使用呢?谢谢了
追答
如果你理解了我的意思就很好改了
pointer():p("Gavin")
{
//char *p=new char[6];
}
~pointer()
{
//delete p;
}
初始化列表的话,就将动态申请释放内存的语句去掉吧, 初始化列表是在函数体执行前执行的
函数体里面再给它申请空间就不对了
最多可以写成这个形式
#include
using namespace std;
#include
class pointer
{
public:
char *p;
pointer():p("Gavin")
{
}
pointer(char *pStr):p(pStr)
{
}
~pointer()
{
}
};
void main()
{
char *p = "1234";
pointer x;
pointer y(p);
cout<<x.p<<endl;
cout<<y.p<<endl;
}
默认指向gavin
可以用参数初始化
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询