在没有提供参数的情况下,如何调用我的重载new
How is my overloaded new getting called when no argument is provided?
在输出中,执行语句Test *m = new Test();
时打印new called
。但是,我们并没有将任何参数传递给用户定义的new
函数。
有人能解释一下这里发生了什么吗?
#include<stdlib.h>
#include<iostream>
using namespace std;
class Test {
public:
void* operator new(size_t size);
void operator delete(void*);
Test() { cout<<"n Constructor called"; }
~Test() { cout<<"n Destructor called"; }
};
void* Test::operator new(size_t size)
{
cout<<"n new called";
void *storage = malloc(size);
return storage;
}
void Test::operator delete(void *p )
{
cout<<"n delete called";
free(p);
}
int main()
{
Test *m = new Test();
delete m;
return 0;
}
这也是Kerrick在size_t参数新运算符中所做的大致内容
隐含地,有一个对Test::new(sizeof(Test))
的调用来获得关键字new的内存,以提供给构造函数使用。
因此,当你没有意识到它时,你实际上是在调用它。你可以使用调试器和堆栈跟踪来解决这个问题,或者使用有关重写新运算符和构造函数如何工作的文档。
Operator New与新关键字的关系
不要被同时存在新关键字和操作员新。当你写:MyClass*x=新的MyClass;有实际上发生了两件事——内存分配和对象建设新关键字对这两者都负责。过程是调用操作员new以便分配内存;另一个步骤是实际调用构造函数。Operator new让您更改内存分配方法,但没有负责调用构造函数。这是新人的工作关键字。
http://www.cprogramming.com/tutorial/operator_new.html
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 函数何时会在c++中包含stack_Unwind_Resume调用
- Singleton模式中的手动析构函数调用:调用多次
- 从同一父调用调用不同的子类函数
- 我可以通过CPP程序中的数据库调用调用Java程序
- C++17标准对在nullptr上调用delete有何规定
- NSIS系统::调用-调用方法失败
- 参数构造函数调用调用
- 当 int 方法工作正常时,void 方法有何不同,或者为什么我不能调用 void 方法?
- 让非托管 C++ 代码调用调用 C# 代码的托管 C++ 代码
- 关于在矢量上调用clear如何改变容量,标准有何规定
- 如何让函数调用调用它的函数
- 如何p/调用调用函数只使用,但c++需要.a/.lib/.o文件
- C#DLL可以调用调用本机C++静态库的C++/CLI托管包装器吗