有一个指针变量:char * p,如何判断p指向的是字符串常量,还是new char[]?

leixinyue 2016-01-18 07:19:21
有一个指针变量:char * p,如何判断p指向的是字符串常量,还是new char[]?

class MyString{

private:
char * m_pData;

public:
MyString(){}
MyString(char * pStr = NULL)
{
m_pData = pStr;//如何判断pStr是一个字符串常量?
}

~MyString()
{
delete m_pData;//如果m_pData指向一个字符串常量,则此处有异常;
}

};
void main()
{
char * pStr = new char[20];
MyString mstr(pStr); //运行正常
MyString str("Hello world"); //析构时,报错。
}


...全文
217 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
paschen 版主 2016-01-18
  • 打赏
  • 举报
回复
引用 4 楼 leixinyue 的回复:
[quote=引用 2 楼 paschen 的回复:] 建议楼主在构造函数中,都使用动态分配,然后将参数字符串复制到分配的内存中
Thx.@paschen 在构造函数中,都使用动态分配,这样如果传进来的是new char[],则需要在类外面进行释放参数指向的内存了。 感觉开辟、释放新内存,这样效率可能受到影响。 如果真的无法判断指字指向的是字符串常量,还是char []。您的方案可以解决问题。[/quote] 请申请谁释放,类中申请的就在析构函数时自己释放了,如果是类外申请的,则你的类不需要负责释放 不管你构造函数的参数传进来的是什么类型,你都重新申请一片内存,然后将该字符串复制到你申请的空间里,对象析构时释放
leixinyue 2016-01-18
  • 打赏
  • 举报
回复
引用 3 楼 yshuise 的回复:
 MyString str("Hello world"); //析构时,报错。
你这个不是new,所以在析构函数中的delete是错误的
@yshuise 所以,我才发了本贴,问如何判断p指向的是字符串常量,还是new char[]?
leixinyue 2016-01-18
  • 打赏
  • 举报
回复
引用 2 楼 paschen 的回复:
建议楼主在构造函数中,都使用动态分配,然后将参数字符串复制到分配的内存中
Thx.@paschen 在构造函数中,都使用动态分配,这样如果传进来的是new char[],则需要在类外面进行释放参数指向的内存了。 感觉开辟、释放新内存,这样效率可能受到影响。 如果真的无法判断指字指向的是字符串常量,还是char []。您的方案可以解决问题。
yshuise 2016-01-18
  • 打赏
  • 举报
回复
 MyString str("Hello world"); //析构时,报错。
你这个不是new,所以在析构函数中的delete是错误的
paschen 版主 2016-01-18
  • 打赏
  • 举报
回复
建议楼主在构造函数中,都使用动态分配,然后将参数字符串复制到分配的内存中
paschen 版主 2016-01-18
  • 打赏
  • 举报
回复
没有直接的判断方法 一个可能不是很好的办法就是去写这个指针,同时捕捉异常,如果出现异常的是就是常量区的字符串

64,683

社区成员

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

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