一个关于异常的

GoonYangXiaofang 2010-11-08 11:14:06

class erp
{
HR* m_hr;
FI* m_fi;
public:
erp()
{
m_hr = new HR();
m_fi = new FI();
}
erp()
{
}
};
if "new FI()" failed in the constructor, how can you detect this problem and release the properly
allocated member pointer m_hr?


1. 如果 new FI 失败,怎么释放 m_hr?
2. 如果 new HR 失败,怎么办?

最好给出完整的解答和解释
...全文
170 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
airtrack 2010-11-08
  • 打赏
  • 举报
回复
看看书上(《C++程序设计语言》或《C++ Primer》)对RAII的介绍吧。
GoonYangXiaofang 2010-11-08
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 jhangverita 的回复:]
erp()
{
m_hr = new HR();
m_fi = new FI();
}
erp()
{
}

这不是重载。
[/Quote]
这个写错了,应是 ~erp()
Jim_King_2000 2010-11-08
  • 打赏
  • 举报
回复
用一般指针没办法做到异常安全的。一定要用RAII的方式。
jhangverita 2010-11-08
  • 打赏
  • 举报
回复
erp()
{
m_hr = new HR();
m_fi = new FI();
}
erp()
{
}

这不是重载。
gules 2010-11-08
  • 打赏
  • 举报
回复
将下面两个指针
HR* m_hr;
FI* m_fi;
这样定义:
auto_ptr<HR> m_hr; // 或用shared_ptr
auto_ptr<FI> m_fi;

在构造函数中:
erp() : m_hr(new HR), m_fi(new FI) {}

不用担心内存分配失败的问题了。
GoonYangXiaofang 2010-11-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jim_king_2000 的回复:]
尽量用auto_ptr。《Exceptional C++》一书中有关于异常安全的详细论述。
[/Quote]

恩,如果只是用一般指针
Jim_King_2000 2010-11-08
  • 打赏
  • 举报
回复

class erp
{
public:
erp()
: m_hr(new HR())
, m_fi(new FI())
{
}

~erp()
{
}

private:
auto_ptr<HR> m_hr;
auto_ptr<FI> m_fi;
};
Jim_King_2000 2010-11-08
  • 打赏
  • 举报
回复
尽量用auto_ptr。《Exceptional C++》一书中有关于异常安全的详细论述。
GoonYangXiaofang 2010-11-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ouyh12345 的回复:]
最好不要在构造函数里做这些
[/Quote]

也可以以这种形式

class A {...};
class B {...};

int main()
{
A * pA = new A;
B * pB = new B;

return 0;
}
ouyh12345 2010-11-08
  • 打赏
  • 举报
回复
最好不要在构造函数里做这些

iambic 2010-11-08
  • 打赏
  • 举报
回复
看Exceptional C++。另外你又没用到什么多态,用得着从堆里分配吗?
liu163169 2010-11-08
  • 打赏
  • 举报
回复
头晕,天天向上,身体好

65,187

社区成员

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

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