size_t parameter new operator
size_t parameter new operator
我有一点在我的脑海中,我不能弄清楚新的操作符重载。假设,我有一个类MyClass,但是MyClass.h MyClass.cpp和main.cpp文件就像;
//MyClass.h
class MyClass {
public:
//Some member functions
void* operator new (size_t size);
void operator delete (void* ptr);
//...
};
//MyClass.cpp
void* MyClass::operator new(size_t size) {
return malloc(size);
}
void MyClass::operator delete(void* ptr) {
free(ptr);
}
//main.cpp
//Include files
//...
int main() {
MyClass* cPtr = new MyClass();
delete cPtr
}
。这个程序运行得很好。然而,我无法理解的是,为什么新操作符可以在没有任何参数的情况下调用,而在其定义中它有一个函数参数,如"size_t size"。我是不是漏掉了什么?谢谢。
不要混淆"new expression"answers"operator new"分配函数。前者导致后者。当您说T * p = new T;
时,它首先调用分配函数来获取内存,然后在该内存中构造对象。该过程大致相当于以下内容:
void * addr = T::operator new(sizeof(T)); // rough equivalent of what
T * p = ::new (addr) T; // "T * p = new T;" means.
(在构造函数抛出的事件中加上一个异常处理程序;在这种情况下,内存将被释放。
新表达式new MyClass()
基本上分为两步定义。首先,它调用您已经重载的allocator函数来获得一些已分配的内存。它将类型MyClass
的大小传递给分配器函数,这就是需要size_t
参数的原因。在此之后,它在分配的内存中构造一个对象并返回指向该对象的指针。
编译器知道类的大小。基本上,它将sizeof(MyClass)
传递给new
函数。
相关文章:
- 过载'operator new'如何导致无限循环?
- "new operator"将另一个类实例化为工厂?
- 在C++中调用 malloc() 与"operator new"函数之间的实现差异
- C++和组装:通过ASM呼叫'operator new'和'operator delete'
- 'operator new':函数不接受 2 个参数
- 错误 C2661:'CObject::operator new':没有重载函数需要 4 个参数
- 错误 35 错误 C2661:'operator new':没有重载函数占用 2 个参数
- 什么是"::operator new"和"::operator delete"?
- void* in malloc vs operator new
- 我们还需要"placement new"和"operator new"吗?
- 何时使用new-operator
- 'operator new'的第一个形式参数必须'size_t'
- 正在对使用operator new okay的放置delete操作的结果调用delete
- operator new[]在MSVC调试时非常慢
- size_t parameter new operator
- ::operator new[]()与::operator new()有什么不同?
- 为什么替换malloc()需要了解链接器,而::operator new()不需要
- 带nothrow选项的Operator new仍然会抛出异常
- :operator delete(void*)是否知道使用::operator new(size_t)分配的内存大小
- 类x没有默认构造函数,operator new继承