gpt4 book ai didi

c++ - 使用两个参数但不赋值调用 new 运算符

转载 作者:搜寻专家 更新时间:2023-10-31 00:54:10 24 4
gpt4 key购买 nike

我找到了这段代码,但我不明白为什么它在项目中有效。代码结构为:

class MyClass {
int value;
};

struct MyStruct {
MyClass classA;
MyClass classB;
};

int main() {

MyStruct myStruct;

new (&((&myStruct)->classA)) MyClass();
new (&((&myStruct)->classB)) MyClass();
}

(内部的 & 号是我添加的,目的是创建一个更小的示例。在源代码中,myStruct 是一个指针)。

编译器说

In function int main()
error: no matching function for call to ‘operator new(sizetype, MyClass*)’
new (&((&myStruct)->classA)) MyClass();
^
note: candidates are:
note: void* operator new(long unsigned int)
note: candidate expects 1 argument, 2 provided

也许我遗漏了一些重要的东西。这是一个大项目,我无法复制它。我无法创建 MWE。我希望有人能向我解释这段代码背后的主要思想以及我必须更改哪些内容才能编译它。

最佳答案

Placement new是 C++ 语言功能之一,需要包含适当的 header 才能尝试使用它们。

使用 placement new 时,表达式必须调用 operator new 的重载作为其评估的一部分。 这个重载,确切地说:

void* operator new (std::size, void*);

但是这个函数并不是在每个翻译单元中都自动为你声明的。因此,要引入它,您必须包含正确的 header ( <new> )。


作为旁注,您显示的代码非常糟糕。它构造了 myStruct 的成员两次!对于非平凡的情况,这可能会造成严重破坏。

非常明确地初始化 myStruct 的正确方法是这样的:

MyStruct myStruct {
{}, // Default construct classA
{} // Default construct classB
};

关于c++ - 使用两个参数但不赋值调用 new 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46193246/

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