没有调用operator delete()的类实现

Sca*_*ark 1 c++ operator-overloading

我有以下代码

#include <iostream>
#include <cstddef>
#include <string>
#include <memory>


class Object
{
public:
       Object()
       {
               std::cout << __PRETTY_FUNCTION__ << std::endl;
       }
       std::string x;

       void *operator new( size_t bytes )
       {
               std::cout << __PRETTY_FUNCTION__ << " : bytes = " << bytes << std::endl;
       }

       void operator delete( void * arg )
       {
               std::cout << __PRETTY_FUNCTION__ << std::endl;
       }
};



int main( int c, char *v[] )
{
       // std::auto_ptr< Object > pObject( new Object() );
       Object *o = new Object();
       delete o;
}
Run Code Online (Sandbox Code Playgroud)

它产生这个输出......

static void* Object::operator new(size_t) : bytes = 8
Run Code Online (Sandbox Code Playgroud)

然后核心转储.

鉴于我没有得到运算符delete()方法的输出,并且它没有核心转储.我假设我的操作符delete()方法没有被调用.

任何人都可以解释为什么没有被调用?

感谢您专注于针对我的ALL CAPS RANTS的核心转储,因为它实际上证明是问题所在.

编辑 - 好的,我从哪里开始.... 我非常抱歉咆哮.我们都在那里,在压力下遇到截止日期,无关紧要的事情似乎引起了一个问题,我们确信这是一回事,事实上它是另一回事.这教会了我一个有价值的东西......我需要开始倾听......我非常感谢这里给出的所有帮助和建议.

谢谢马克.

CB *_*ley 9

你的new表达做了两件事.它调用适当的operator new函数来分配一些内存,然后Object在返回值指向的内存中构造一个new operator new.

由于您没有返回语句,因此您operator new将获得未定义的行为.如果我们探索可能发生的事情,则函数可能会返回返回值的随机值,并且编译器会尝试在无效地址处构造Object(包括其拥有的std::string).

这会代码到达delete语句之前导致崩溃.


vis*_*tor 5

operator new 必须返回指向足够内存的指针(或抛出异常),因为new-expression也会尝试为已分配的内存调用Object的构造函数.问题不在于delete,它new Object无法正常完成.