问题一:C++中的operator new默认使用什么函数来分配内存?
C++中的operator new默认使用什么函数来分配内存?
参考回答:
默认使用glibc的malloc函数来分配内存。
关于本问题的更多回答可点击原文查看:
https://developer.aliyun.com/ask/639329
问题二:在C++中,我们如何通过operator new来自定义内存分配?
在C++中,我们如何通过operator new来自定义内存分配?
参考回答:
可以通过重载operator new来自定义内存分配。例如,我们可以实现自己的operator new,将其内部的malloc替换为RedisModule_Alloc。这样,每次使用new关键字分配内存时,实际上会调用我们自定义的operator new。
关于本问题的更多回答可点击原文查看:
https://developer.aliyun.com/ask/639330
问题三:为什么说operator new的重载更贴切地被称为“覆盖”?
为什么说operator new的重载更贴切地被称为“覆盖”?
参考回答:
operator new的重载被更贴切地称为“覆盖”,因为C++编译器内置的operator new被实现为一个弱(weak)符号。当我们自己实现了一个强符号版本的operator new时,它会覆盖编译器自己的实现。
关于本问题的更多回答可点击原文查看:
https://developer.aliyun.com/ask/639331
问题四:如何重载operator new和operator delete以使用Redis的内存分配函数?
如何重载operator new和operator delete以使用Redis的内存分配函数?
参考回答:
可以通过以下方式重载operator new和operator delete以使用Redis的内存分配函数:
void *operator new(std::size_t size) {
return RedisModule_Alloc(size);
}
void operator delete(void *ptr) noexcept {
RedisModule_Free(ptr);
}
这样,每次在代码中使用new分配内存或使用delete释放内存时,实际上会调用这些重载的操作符。
关于本问题的更多回答可点击原文查看:
https://developer.aliyun.com/ask/639332
问题五:如果Redis加载了多个C++编写的模块,并且它们都重载了operator new,会有什么影响?
如果Redis加载了多个C++编写的模块,并且它们都重载了operator new,会有什么影响?
参考回答:
可能会出现冲突。因为operator new具有全局可见性,所以动态连接器会把先加载的模块实现的operator new函数加入到全局符号表里。后续加载的模块在进行符号重定位时,可能会将自己的operator new链接到先前加载的模块实现的operator new上。这可能导致后加载的模块的行为出现异常,特别是当不同的模块提供了不同的operator new实现时。
关于本问题的更多回答可点击原文查看: