gpt4 book ai didi

c++ - 为什么 operator new function - 放置形式在类里面可以?

转载 作者:太空狗 更新时间:2023-10-29 21:47:33 26 4
gpt4 key购买 nike

我们从 c++ 11(在 c++98/03 标准中也是如此)标准(见下文)中得知,我们不能尝试替换 operator new 函数 - 全局空间中的放置形式,因为它已经被定义。

18.6.1.3 Placement forms [new.delete.placement]

These functions are reserved, a C++ program may not define functions that displace the versions in the Standard C++ library (17.6.4). The provisions of (3.7.4) do not apply to these reserved placement forms of operator new and operator delete.

下面代码段中的第 2 点已经证明了这一点,如预期的那样编译错误。

但我仍然可以覆盖类(class)级别的新布置,效果很好,请参见下面代码段中的第 (2) 点。这是为什么?不应该编译应该尽量根据标准阻止 (2) ???

请参阅下面的代码段:

class Test
{
public:
Test(int i):m_i(i) { cout << "Test::Test()" << endl; }
~Test() { cout << "Test::~Test()" << endl; }

//(1)class level override placement new
void* operator new (std::size_t size) throw (std::bad_alloc) {
cout << "My class level new" << endl;
return malloc(size);
}

//(2)class level override placement new
void* operator new (std::size_t size, void* ptr) throw() {
cout << "My class level non-throwing placement new" << endl;
return ptr;
}
private:
int m_i;

};

//<1>global replacement for operator new - single object form
void* operator new (std::size_t size) throw (std::bad_alloc) {
cout << "My global new" << endl;
return malloc(size);
}


//<2>global replacement for operator new - replcement form
//NB. This is a attempt that definitely fails according to c++ stadnard:
//does get compile error: error: redefinition of 'void* operator new(std::size_t, void*)'
/*
void* operator new (std::size_t size, void* ptr) throw() {
cout << "My global non-throwing placement new" << endl;
return ptr;
}
*/

int main() {
Test* p = new Test(1);
delete p;

cout << "" << endl;
void* mem = operator new(sizeof(Test));
Test* p2 = new(mem) Test(1);
p2->~Test();
operator delete (mem);

return 0;
}

下面是预期的输出:

My class level new
My global new
Test::Test()
Test::~Test()

My global new
My class level non-throwing placement new
Test::Test()
Test::~Test()

============================================= ===================================进一步澄清我的问题:

18.6.1.3 Placement forms These functions are reserved, a C++ program may not define functions that displace the versions in the Standard C++ library (17.6.4). The provisions of (3.7.4) do not apply to these reserved placement forms

of operator new and operator delete.

这解释了我代码段中点 <2> 处的预期编译错误,所以这个没问题。

但为什么我可以在类(class)说明中的第 (2) 点取代类(class)级别的安置表格?

最佳答案

§18.6.1.3 列出了以下形式:

void* operator new(std::size_t size, void* ptr) noexcept;
void* operator new[](std::size_t size, void* ptr) noexcept;
void operator delete(void* ptr, void*) noexcept;
void operator delete[](void* ptr, void*) noexcept;

“C++ 程序不得定义取代标准 C++ 库中版本的函数”的规则仅适用于这四个函数声明,它们不在任何命名空间中。如果您在类或命名空间中创建自己的版本,那很好。

事实上,有时您必须提供自己的新展示位置。如果你在你的类中声明一个普通的 operator new,它会隐藏标准库提供的 placement new,如果你想使用,你需要在类中添加你自己的 placement new new (ptr) T(...) 语法。

这只是保证调用 ::new (ptr) T(...) 保证表现得像标准放置 new。 (注意 :: 前缀。)

关于c++ - 为什么 operator new function - 放置形式在类里面可以?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12919474/

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