gpt4 book ai didi

c++ - 为什么即使我在重载函数中使用 malloc,重载的 new 运算符也会调用构造函数?

转载 作者:搜寻专家 更新时间:2023-10-30 23:55:31 26 4
gpt4 key购买 nike

我正在尝试理解重载 new 运算符。我写的代码如下。

#include <iostream>
#include <cstdlib>
#include <new>

using namespace std;

class loc
{
int lo, la;

public:
loc()
{
}

loc(int x, int y)
{
cout << "In constructor\n";
lo = x;
la = y;
}

void show()
{
cout << lo << " ";
cout << la << endl;
}

void *operator new(size_t sz);
void operator delete(void *p);
};

void *loc::operator new(size_t sz)
{
cout << "in Overloaded new\n";
void *p = malloc(sz);

return p;
}

void loc::operator delete(void *p)
{
cout << "in Overloaded delete\n";
free(p);
}

int main()
{
loc *p1 = new loc(10, 20);
p1->show();
delete p1;
return 0;
}

我认为它不会调用构造函数,因为我在重载函数中使用 malloc 函数调用重载了 new 运算符。但是输出如下。

in Overloaded new
In constructor
10 20
in Overloaded delete

这意味着正在调用构造函数。这怎么可能?这是否意味着 malloc() 会调用构造函数?

最佳答案

A new expression导致发生两件不同的事情:开始创建对象所需的内存分配,以及对象的初始化。

new operator ,另一方面,只处理分配部分。当您针对特定类重载 new 运算符时,您正在替换对对象的内存分配。

当您意识到并非所有对象都分配在堆上时,这种功能划分就有意义了。考虑以下情况:

int main() {
string someString;
..
}

局部变量不是动态分配的; new 未使用;但是该对象仍需要初始化,因此仍会调用构造函数。请注意,您不需要显式调用构造函数 - 在创建对象时,将始终调用适当的构造函数来初始化对象的语言是隐含的。

当您编写“new 表达式”时,编译器知道发出指令来调用 new 运算符(根据需要分配内存),然后调用构造函数(初始化对象)。无论您是否重载 new 运算符,都会发生这种情况。

关于c++ - 为什么即使我在重载函数中使用 malloc,重载的 new 运算符也会调用构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31106449/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com