gpt4 book ai didi

c++ - 为类成员分配内存

转载 作者:搜寻专家 更新时间:2023-10-31 02:13:10 25 4
gpt4 key购买 nike

我试图为两种相似的类型提供一个统一的接口(interface),一种处理double,另一种处理float

class float_type {
float_type() { /* does floaty stuff */ }
float f();
};
class double_type {
double_type() { /* does doubly stuff */ }
double f();
};

我想写一个类,根据程序需要做什么来分配一个或另一个。我对 float_type::f() 转换为 double 的结果非常满意。事实上,它无论如何都会发生。我试着这样写:

class union_type {
bool is_double;
char mem[ sizeof(double_type) > sizeof(float_type)
? sizeof(double_type) : sizeof(float_type) ];
public:
float_or_double_value_reader(bool is_double)
: is_double(is_double)
{
if (is_double) new(mem) double_type();
else new(mem) float_type();
}

~float_or_double_value_reader() {
if (is_double) delete static_cast<double_type*>(mem);
else delete static_cast< float_type*>(mem);
}

double f() {
return (is_doubled
? static_cast<double_type*>(mem)->f()
: static_cast< float_type*>(mem)->f()
);
}
};

但是我得到了 invalid static_cast from type 'char [128]' to type 'double_type'

我知道我可以添加一个成员指针来指向 new 返回的内容,但这将是多余的,因为我已经知道 mem 的位置,所以我想避免这种情况。

如果我改用 reinterpret_cast,当 union_type 被销毁时,我会在运行时得到 free(): invalid pointer:

这里正确的转换方法是什么?

最佳答案

reinterpret_cast应该是合适的类型转换方法。

但是,您不能简单地delete reinterpret_cast<double_type*>(mem)因为这不仅会破坏对象,还会释放内存,就好像它是用 new 分配的一样- 事实并非如此。

您可以使用 reinterpret_cast<double_type*>(mem)->~double_type();在不尝试释放内存的情况下销毁对象。

当然以上适用于float_type

关于c++ - 为类成员分配内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41732555/

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