重载运算符 new(),为什么构造函数被调用两次?
overload operator new(), why constructor is called twice?
我在学习new/delete重载时无法理解一些问题。 问题:
- 为什么在构造函数之前调用new,在删除之前调用析构函数?
- 为什么在使用 ::new 时调用构造函数两次?
我在这里附加了代码:
#include<iostream>
using namespace std;
class MyClass
{
public:
MyClass() {
cout << "My Class is Constructed !" << endl;
}
~MyClass() { cout << "My Class is Deleted ! " << endl; }
static void *operator new(size_t Size)
{
cout << "new call" << endl;
MyClass *p = ::new MyClass;
return p;
}
static void operator delete(void *p)
{
cout << "delete call" << endl;
::delete p;
}
};
int main()
{
MyClass *p = new MyClass;
delete p;
cin.get();
return 0;
}
output:
new call
My Class is Constructed !
My Class is Constructed !
My Class is Deleted !
delete call
发生这种情况的原因是,当您使用new
分配某些东西时,分配和构造分两个阶段发生。 第一个是实际分配,第二个是通过放置新建筑。
您提供的重载仅用于分配内存(因此是size_t
参数(,而是在类上调用了new
,该类将从上面执行这两个步骤。 您应该只分配该函数中的内存。 所以把你的函数改成
static void *operator new(size_t size)
{
return ::operator new(size);
}
你会看到这个类只被构造一次。
相关文章:
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- C++析构函数调用两次,堆栈分配的复合对象
- 对于优化级别为 0 的 std::vector,析构函数被调用两次
- 为什么这个自定义分配器的析构函数在 GCC/MSVS 的 stdlib 中被调用两次
- 重载运算符 new(),为什么构造函数被调用两次?
- 当 reset() 被unique_ptr调用两次时会发生什么?
- CEdit 框的NM_KILLFOCUS被调用两次
- 为什么这个构造函数被调用两次
- 析构函数在与 STL 的共享指针中调用两次
- 构造函数在不同线程中的静态单例类上调用两次
- 类析构函数在创建shared_ptr时调用两次
- 为什么在 C++ 中,当对象包含在另一个对象中时,复制构造函数被调用两次
- makefile 需要调用两次
- [c++]为什么我的类析构函数被调用两次?
- 为什么这个程序中的析构函数被调用两次
- 显式调用析构函数时被调用两次
- C++11 std::generate 和 std::uniform_real_distribution 调用两次会产生
- 基类函数被调用两次
- 为什么析构函数被调用两次,而构造函数只被调用一次
- 为什么函子的 dtor 在作为函数的参数传递给线程时调用两次(多次)