gpt4 book ai didi

c++ - 重载 operator new

转载 作者:行者123 更新时间:2023-11-27 23:59:57 30 4
gpt4 key购买 nike

我对运算符重载 new 和 delete 有点困惑。我写了一些测试:

#include <iostream>

using namespace std;

class Test
{
public :

Test()
{
cout << "Test - ctor" <<endl;
}

~Test()
{
cout << "Test - dtor" <<endl;
}

Test(const Test& t)
{
cout << "Test - copy ctor" <<endl;
}

Test& operator = (const Test& t)
{
cout << "Test - assiment operator" <<endl;
}

void* operator new(size_t size)
{
cout << "Test - operator new" <<endl;
return NULL;
}

void print()
{
cout << "print" << endl;
}
};


int main()
{
Test* t = new Test();
t->print();
return 0;
}

输出是:

Test - operator new                                                                                                                                                                                
Test - ctor
print

现在,如果我从“new”返回“NULL”,为什么我的程序在调用 print 函数时不会崩溃?谢谢。

最佳答案

因为 print() 实际上不需要它的类 Test 中的任何东西。它所做的只是将一条消息打印到 stdout。请记住 t->print();print(t); 相同,您的函数签名实际上是:

void print(Test* t);

但这都是编译器为您完成的。

t 只是没有在方法中使用,因此你很(不)幸运,因为它运行了。不过,这仍然只是普通的未定义行为。

如果你绝对想看到事情崩溃和燃烧然后稍微改变你的类:

class Test
{
public :

Test() : x(0)
{
cout << "Test - ctor" <<endl;
}

~Test()
{
cout << "Test - dtor" <<endl;
}

Test(const Test& t)
{
cout << "Test - copy ctor" <<endl;
}

Test& operator = (const Test& t)
{
cout << "Test - assiment operator" <<endl;
}

void* operator new(size_t size)
{
cout << "Test - operator new" <<endl;
return NULL;
}

void print()
{
cout << "print" << x << endl;
}

private:
int x;
};

关于c++ - 重载 operator new,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39913929/

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