网页
资讯
视频
图片
知道
文库
贴吧
地图
采购
进入贴吧
全吧搜索
吧内搜索
搜贴
搜人
进吧
搜标签
日
一
二
三
四
五
六
签到排名:今日本吧第
个签到,
本吧因你更精彩,明天继续来努力!
本吧签到人数:0
一键签到
成为超级会员,使用一键签到
一键签到
本月漏签
0
次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行
补签
。
连续签到:
天 累计签到:
天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
01月07日
漏签
0
天
c++吧
关注:
592,708
贴子:
2,105,768
看贴
图片
吧主推荐
游戏
25
回复贴,共
1
页
<<返回c++吧
>0< 加载中...
关于内存管理
只看楼主
收藏
回复
Oo叮咚叮咚oO
&
9
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
Foo *p = new Foo;
p->~Foo();
new (p) Foo(); // 原位置分配
p->~Foo(); // 和下面一句模拟delete
operator delete(p);
只是单纯地想问一下这个过程是否合法
如果合法是否不推荐
我对这个过程中发生的事情是否理解有误
至少编译器似乎对这段代码没有意见=_=
幻の上帝
->*
15
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
well-formed & well-defined iff. Foo is complete object type
该用就用。
superdogbox
<
11
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
delete or free
silmerusse
^
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
C++的话没有特别理由不推荐再用raw new/delete
用智能指针省很多事。
std::shared_ptr<Foo> p(new Foo()); //不用手动调用delete,引用为0时自动delete
一只大水鱼
->*
15
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
参考标准库的allocator的实现
幻の上帝
->*
15
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
哦,漏了排除数组和抽象类。
over-aligned type是impl-def。
还有,如果自己提供了operator new/operator delete又没对上,可能抽风 。
最后,如果不光看这坨代码,只使用::operator new,之前有其它new满足被扩展合并调用::operator new的条件(也要求同时在之后使用delete),operator delete才一定UB
。
最后一点不适用于C++11及之前的实现。
lulu__zc
throw
3
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
基于内存管理来说只是为了防止大量反复new和delete小对象导致出现太多内存碎片而使空间浪费.然而你这个删掉在原位置在new等于要大量管理很多不同类型大小的指针.感觉得不偿失.还不如做了个小对象内存分配的内存池.集体管理.大的对象就直接new和delete就好.
幻の上帝
->*
15
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
我说的该用的地方嘛……
比如逗比libstdc++4.9没实现basic_ios以下的一大坨move operator=。所以就先~拆掉然后重新构造了。
yjryym
+
13
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
delete ptr; ptr = new CLSNAME;
像这种需要重新创建对象的写法可以优化成重新构造对象写法:
ptr->~CLSNAME; new(ptr)CLSNAME;
还有就是非new创建对象需要手动构造,非delete释放的对象需要手动析构。
别的情况下尽量不用。
萧の十三郎
*
14
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
我只灌水不说话
登录百度账号
扫二维码下载贴吧客户端
下载贴吧APP
看高清直播、视频!
贴吧页面意见反馈
违规贴吧举报反馈通道
贴吧违规信息处理公示