gpt4 book ai didi

c++ - 未调用 operator delete() 的类实现

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:05:20 24 4
gpt4 key购买 nike

我有以下代码

#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;
}

它产生这个输出...

static void* Object::operator new(size_t) : bytes = 8

然后是核心转储。

考虑到我没有从 operator delete() 方法获得输出并且它进行了核心转储。我假设我的 operator delete() 方法没有被调用。

谁能解释为什么它没有被调用?

感谢您专注于针对我全部大写的 RANTS 的核心转储,因为它实际上是问题所在。

编辑--好吧,我从哪里开始......我非常抱歉咆哮。我们都经历过,在按时完成任务的压力下,一些无关紧要的事情似乎导致了问题,我们相信这是一回事,但实际上是另一回事。这教会了我宝贵的一课……我需要开始倾听……我非常感谢这里提供的所有帮助和建议。

谢谢马克。

最佳答案

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

由于您在operator new 中没有返回语句,您会得到未定义的行为。如果我们探索可能发生的情况,很可能该函数返回一个随机值作为返回值,并且编译器尝试构造 Object(包括其拥有的 std::string) 在无效地址。

这将在您的代码到达 delete 语句之前导致崩溃。

关于c++ - 未调用 operator delete() 的类实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3913051/

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