社区
C++ 语言
帖子详情
C++ 重载new和delete必须为static成员函数吗?
yby4769250
2011-10-05 07:04:04
如题,在练习写个自己的内存池,重载了new和delete发现,无论void* operator new(size_t)前面是否显式声明有static,它都是static成员函数?是否是这样?如果是,如何解释?
...全文
724
15
打赏
收藏
C++ 重载new和delete必须为static成员函数吗?
如题,在练习写个自己的内存池,重载了new和delete发现,无论void* operator new(size_t)前面是否显式声明有static,它都是static成员函数?是否是这样?如果是,如何解释?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
15 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
stackoverlow
2011-10-05
打赏
举报
回复
不懂~~每日一回
qq120848369
2011-10-05
打赏
举报
回复
简单的明白opeartor new相当于malloc,还没有placement new对象,所以应该属于类而不是对象。
taodm
2011-10-05
打赏
举报
回复
呵呵,楼主,等你学多了,你就自己明白了。
反正,学习的弯路都是必须自己走过了才能明白的。
大家都这么过来的。
yby4769250
2011-10-05
打赏
举报
回复
[Quote=引用 9 楼 chiyer 的回复:]
c++ iso
12.5
Any allocation function for a class T is a static member (even if not explicitly declared static).
[/Quote]
很多大牛在涉及到标准时,总是能翻阅C++标准,我也要这样学习啊,呵呵
yby4769250
2011-10-05
打赏
举报
回复
[Quote=引用 8 楼 nuaa_ybl 的回复:]
因为new对象时,对象还没有,所以要声明为static函数。delete对象也一样。
[/Quote]
和我的想法差不多
yby4769250
2011-10-05
打赏
举报
回复
1
[Quote=引用 6 楼 taodm 的回复:]
如果当初规定为非static,你现在一样会找出个理由的。
规定,就不要硬找理由了,很多只是c++创始人的一时审美观而已。
[/Quote]
new为static不可能这样,不可能仅仅因为发明者的偏好,如果说函数参数列表为什么用()圆括号是出于偏好还能让人信服,new为static也是出于偏好是无法让人信服的
星羽
2011-10-05
打赏
举报
回复
c++ iso
12.5
Any allocation function for a class T is a static member (even if not explicitly declared static).
代码栈
2011-10-05
打赏
举报
回复
因为new对象时,对象还没有,所以要声明为static函数。delete对象也一样。
quwei197874
2011-10-05
打赏
举报
回复
[Quote=引用 6 楼 taodm 的回复:]
如果当初规定为非static,你现在一样会找出个理由的。
规定,就不要硬找理由了,很多只是c++创始人的一时审美观而已。
[/Quote]++
taodm
2011-10-05
打赏
举报
回复
如果当初规定为非static,你现在一样会找出个理由的。
规定,就不要硬找理由了,很多只是c++创始人的一时审美观而已。
yby4769250
2011-10-05
打赏
举报
回复
[Quote=引用 3 楼 songjinshi 的回复:]
运算符重载无所谓静态与否,你就把它当成一个普通运算符使用就行了,想要完成什么样的工作就写进去就行了。
[/Quote]
其他如+-*/当然可以像你这么说,但是new和delete却不行,不信你试试,重载new或者delete,你在函数体内访问类的非static成员看看
yby4769250
2011-10-05
打赏
举报
回复
[Quote=引用 1 楼 taodm 的回复:]
规定,仅此而已。
建议先去找本effective c++增强下语法基础。
[/Quote]
以前没重载过new和delete,所以对这个规定不是很清楚。现在这个规定,我也是需要知道原因的,我在二楼的想法不知道是否正确,但是感觉是正确的
Vincent_Song
2011-10-05
打赏
举报
回复
运算符重载无所谓静态与否,你就把它当成一个普通运算符使用就行了,想要完成什么样的工作就写进去就行了。
yby4769250
2011-10-05
打赏
举报
回复
似乎自己想通了,new是对全局的堆内存操作的,不是对对象本身的内存进行操作的,因此必须为static,不是属于对象的成员函数,而是类的成员函数
taodm
2011-10-05
打赏
举报
回复
规定,仅此而已。
建议先去找本effective c++增强下语法基础。
C++
new
/
delete
重载
如果
重载
的是
成员函数
,责operator
new
和operator
delete
函数
必须
是静态的。operator
new
和operator
delete
的命名容易让人误解,与其他operator函数(如operator=)不同,这两个函数并没有
重载
new
和
delete
。通过分析上面的工作过程,可以看到
new
和
delete
实际并不等同于operator
new
() 和operator
delete
(),
new
和
delete
做的事情要更多,实际上我们不能重定义
new
和
delete
表达式的行为。
C++
动态内存:(二)
重载
new
和
delete
一、
重载
的原因 用
new
创建动态对象时会发生两件事:(1)使用operatoe
new
()为对象分配内存(经常是调用malloc)(2)调用构造函数来初始化内存。相对应的调用
delete
运算符会(1)首先调用析构函数(2)调用operator
delete
()释放内存(经常是调用free)。我们无法控制构造函数和析构函数的调用,是由编译器调用的。但可以改变内存分配函数operator
new
()和operator
delete
()。[链接:
C++
中的
new
/
new
],
delete
/
delete
[] 使用了n
C++
中
重载
new
和
delete
的使用
C++
中
重载
new
和
delete
的使用
重载
new
和
delete
重载
new
和
delete
C++
new
delete
运算符
重载
每个类中都包含默认的
new
,
delete
,
C++
程序员可以对
new
和
delete
进行
重载
,达到想要的功能。
重载
new
操作符 格式如下
static
void* operator
new
(size_t t) { return xxx; } 如果直接返回nullptr, 那么这个类就无法进行
new
操作了。
重载
delete
操作符 格式如下:
static
void operator
delete
(void* p) { } 具体应用 下面是在Test类中
重载
new
、
delete
,
C++ 语言
64,648
社区成员
250,476
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章