gpt4 book ai didi

c++ - 在全局变量上使用 placement new 时有什么不正确的地方吗?

转载 作者:太空宇宙 更新时间:2023-11-04 12:12:11 26 4
gpt4 key购买 nike

我在玩一个想法,我可以在全局范围内拥有变量,但是 not construct them .请注意,有一个新的展示位置正在运行。但是我想知道这段代码有什么未定义或不正确的地方

#include <new>
#include <cstdio>
#include <typeinfo>

//#define AlignAs alignas(T)
#define AlignAs

template<class T>struct BlockOf {
AlignAs char t[sizeof(T)];
operator T&() { return reinterpret_cast<T&>(*this); }
~BlockOf(){((T*)&t)->~T(); }
};
struct B{
virtual void v(){}
~B() { printf("B\n"); }
};
struct A: B{
A(){printf("a\n");}
int regularDots;
void v() { printf("A virtual\n"); }
};

BlockOf<A> _a;
A&a=_a;

void init(){
new(&a) A;
}

int main() {
init();
A aa;
a.regularDots=9;
printf("%s %s %d %d\n",
typeid(a).name(),
typeid(aa).name(),
typeid(a).hash_code()==typeid(aa).hash_code(),
sizeof(a) == sizeof(aa)
);
B *b = &a;
b->v();
}

最佳答案

这个不清楚

operator T&() { return *reinterpret_cast<T*>(this); }

改为使用

operator T&() { return reinterpret_cast<T&>(t[0]); }

我认为 this 需要指向第一个成员,但明确使用数组对我来说似乎更安全。


为了回答你的主要问题,3.8p8 包含对重用属于具有静态存储持续时间的变量的内存的限制,并且由于原始类型有一个普通的析构函数,你应该没问题。

If a program ends the lifetime of an object of type T with static (3.7.1), thread (3.7.2), or automatic (3.7.3) storage duration and if T has a non-trivial destructor, the program must ensure that an object of the original type occupies that same storage location when the implicit destructor call takes place; otherwise the behavior of the program is undefined.

关于c++ - 在全局变量上使用 placement new 时有什么不正确的地方吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9345146/

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