分享一下我对新运营商的理解。新操作员做两份工作。
new 运算符使用全局方法::operator new() 分配内存,并使用放置 new 运算符在同一位置构造内存。新的展示位置也是全球版本。
如果我在类中重载 new 运算符,编译器将禁用同一类的内存分配和构造的全局方法。这意味着我需要重载 new 运算符来分配内存并放置 new 运算符来构造内存。 在下面的示例中,我只是重载 new 运算符来分配内存。
#include <iostream>
using namespace std;
class Base
{
public:
Base()
{
cout << __FUNCTION__ << endl;
}
void* operator new(size_t _size)
{
cout << "Base new operator" << endl;
void *p = ::operator new(_size); // allocating dynamic memory using global new defination
if(p == NULL)
{
cout << "Sorry, Memory allocation failed";
return NULL;
}
return p;
}
};
int main()
{
Base *p = new Base();
return 0;
}
输出:
Base new operator
Base
内存分配是通过重载的new操作符完成的,我不确定内存是否是使用全局放置new操作符构造的;如果是,谁在调用放置新运算符,如果不是,那么在没有放置新运算符的情况下如何构造相同的内存?
这可能是一个愚蠢的问题,但如果有人可以帮助我解决我的疑问,那么您的有用建议将极大地提高我的理解。
该对象被放置在重载的运算符 new 返回的内存中。无法覆盖定位本身,您只能覆盖它分配内存的方式。如果您还想控制放置位置,则需要执行其他操作,而不是覆盖 new 运算符(例如,在另一个函数中分配内存和 Construction_at)。
在高层次上
new
用于构造一个对象。
使用分配变量时,它首先分配内存,然后在分配的内存上调用构造函数。
当使用放置新变体时,它仅在提供的内存上调用构造函数(假设您给出的指针指向合适的内存块)
您只能覆盖分配
new
运算符。重载它时,您不会覆盖构造部分,而只会覆盖内存分配部分(因此是类型不可知的签名)。 ::operator new(size)
基本上等同于 malloc
。
因此,您的重载仅分配内存,并且将在重载返回的内存上调用构造函数
new