Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么delete操作符调用析构函数而free不';T_C++_Operator Overloading_Destructor_New Operator_Delete Operator - Fatal编程技术网

C++ 为什么delete操作符调用析构函数而free不';T

C++ 为什么delete操作符调用析构函数而free不';T,c++,operator-overloading,destructor,new-operator,delete-operator,C++,Operator Overloading,Destructor,New Operator,Delete Operator,我看到一个游戏开发者在YouTube上超载了新建和删除运营商。他的名字叫彻诺 void* operator new(size_t size){ return malloc(size); } void operator delete(void* pointer, size_t size){ free(pointer); } 现在我做的是创建了一个类: struct MyClass{ int my_int; MyClass(int a): my_int{a}{}

我看到一个游戏开发者在YouTube上超载了新建删除运营商。他的名字叫彻诺

void* operator new(size_t size){
    return malloc(size);
}
void operator delete(void* pointer, size_t size){
    free(pointer);
}
现在我做的是创建了一个类:

struct MyClass{
    int my_int;
    MyClass(int a): my_int{a}{}
    ~MyClass(){cout << "MyClass is destructed" << endl;}
};
输出:

MyClass is destructed
所以,这是我的问题。为什么delete调用析构函数而free()不调用,即使delete所做的只是它在内部使用free()(我假设)


我知道我们不应该在使用new操作符分配的对象上使用free()。但是,即使在这种情况下,new操作符在内部使用malloc()
std::alloc
std::alloc
std::aligned_alloc
,或
std::realloc
调用未定义的指针。因此,您不能期望从程序中得到任何合理的结果,因为您使用
操作符new
MyClass
对象分配了内存


因为
delete
会销毁对象,而
free
只会释放内存<代码>自由< /代码>,如 MalOC4/COD>,是C++函数,对C++一无所知。注意<代码>运算符new < /C> >和<代码>操作符删除>代码>是分配和释放内存的工具(它们应该被称为“分配”和“解除分配”,但C++尽量避免添加关键字)。它们与新表达式和delete-expression不直接对应。您需要区分
operator delete
delete
表达式。基本上,
delete
expression=destruction+
operator delete
malloc
free
都是C函数。他们对C++对象一无所知,也不知道它们是如何工作的。代码>新< /COD>和 DE> OTHH,是C++构造和知道如何处理类。它根本不可能。code>free不知道传递的是什么类型的指针,因此即使它想调用析构函数,也无法调用。从技术上讲,对象是不分配的。只分配了它们的存储空间。然后在这个存储中初始化(构造)对象。@ArtazaSameen,是的,我读了你的全部问题,但你错了。“我知道我们不应该使用free()”-这不是“你不应该这样做”。你澄清了一个误解,但你没有回答这个问题。为什么
free
不呼叫解构师?它已经在评论中重复了好几次,但答案没有提到it@463035818_is_not_a_number,很抱歉;我认为“免费不呼叫DTor,因为它是”是我们正在寻找的,我没有看到评论中提到它。根据UB定义,如果编译器决定抛出
std::runtime_错误(“new返回ptr时免费调用”)
在这种情况下,它仍将符合标准。免费不调用析构函数与OPs代码中的UB无关。对于他们提出的问题,OPs代码并不是一个很好的例子。无论如何,我认为OP已经从副本中得到了他们想要的(提到UB是一个很好的补充,在副本中没有明确提到)。
MyClass is destructed