内存申请和释放的疑问?

WuYL7812 2004-09-19 03:58:17
1.用new申请内存时返回NULL,说明失败,怎么不抛出异常呢?看msdn上说要抛出bad_alloc的.
2.以下代码
unsigned char *buffer = new unsigned char[sizeof(string)];
string *pstr = new (buffer) string;

这样申请的的内存如何释放?
我发现delete pstr, buffer;和delete pstr;都可用,不知应该用哪个?
buffer和pstr的值是相等的,如果应该用delete pstr, buffer;能不能改成delete pstr, pstr;
之后还有没有必要delete [] buffer;?
...全文
99 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
whyglinux 2004-09-19
  • 打赏
  • 举报
回复
上面 idleguy(闲人) 说得很对,在 delete[] buffer 之前还需要显式调用 string 类的析构函数:pstr->~string(),这样才能把 string 使用的动态内存也释放。我上面说得不全面。
whyglinux 2004-09-19
  • 打赏
  • 举报
回复
上面 idleguy(闲人) 说得很对,在 delete[] buffer 之前还需要显式调用 string 类的析构函数:pstr->~string(),这样才能把 string 使用的动态内存也释放。我上面说得不全面。
daylove 2004-09-19
  • 打赏
  • 举报
回复
清山流水说的明白,我喜欢,
whyglinux 2004-09-19
  • 打赏
  • 举报
回复
1. 通常的 new 是不会返回 NULL 的,不能用 new 的返回值和 NULL 比较的方式来判断 new 是否成功。new 不成功要抛出异常。如果在程序中不捕捉这个异常,程序运行时会异常退出。

如果你使用 new 的 nothrow 版本,则程序 new 失败时会返回 NULL。其使用形式是:

int* pint = new(nothrow) int[10]; // 把 10 改为一个充分大的数可使 new 失败
if (p == NULL) { // 判断是否 new 成功
perror("new");
exit(1);
}

2.

delete[] buffer; 就可以了。string *pstr = new (buffer) string; 实际上只是调用 string 的构造函数对 buffer 指向的对象进行初始化,实际上并不分配内存。
idleguy 2004-09-19
  • 打赏
  • 举报
回复

1、确实抛出,确切的说,如果分配内存失败,则会抛出一个std::bad_alloc.当然,如果你设定了new_handler,那么在抛出异常之前会调用你指定的函数。
请参考Effective C++.

2、placement new.
如果用placement new在内存中创建对象,那么应该避免对这段内存delete,而应该直接调用pstr的的析构函数。

请参考More Effective c++.

我也是初学,仅供参考。

64,637

社区成员

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

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