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的核心转储,因为它实际上证明是问题所在.
编辑 - 好的,我从哪里开始.... 我非常抱歉咆哮.我们都在那里,在压力下遇到截止日期,无关紧要的事情似乎引起了一个问题,我们确信这是一回事,事实上它是另一回事.这教会了我一个有价值的东西......我需要开始倾听......我非常感谢这里给出的所有帮助和建议.
谢谢马克.
你的new表达做了两件事.它调用适当的operator new函数来分配一些内存,然后Object在返回值指向的内存中构造一个new operator new.
由于您没有返回语句,因此您operator new将获得未定义的行为.如果我们探索可能发生的事情,则函数可能会返回返回值的随机值,并且编译器会尝试在无效地址处构造Object(包括其拥有的std::string).
这会在代码到达delete语句之前导致崩溃.
operator new 必须返回指向足够内存的指针(或抛出异常),因为new-expression也会尝试为已分配的内存调用Object的构造函数.问题不在于delete,它new Object无法正常完成.
| 归档时间: |
|
| 查看次数: |
544 次 |
| 最近记录: |