gpt4 book ai didi

c++ - delete 如何从基指针知道派生类的大小?

转载 作者:太空狗 更新时间:2023-10-29 23:49:22 26 4
gpt4 key购买 nike

我很好奇 delete 运算符在基指针上调用 delete 时如何知道派生类的大小,这是一个最小的例子:

class IVariant
{
public:
virtual ~IVariant() = default;
virtual void print_value() = 0;
};

template<typename T>
class Variant: public IVariant {};

template<>
class Variant<int>: public IVariant
{
private:
int m_integer;

public:
Variant(int integer): m_integer(integer) {}
void print_value() override
{
printf("integer: %i\n", m_integer);
}
};

template<>
class Variant<double>: public IVariant
{
private:
double m_dbl;

public:
Variant(double val): m_dbl(val) {}
void print_value() override
{
printf("double: %g\n", m_dbl);
}
};

template<>
class Variant<std::string>: public IVariant
{
private:
std::string m_string;

public:
Variant(const std::string& string): m_string(string) {}
void print_value() override
{
printf("string: %s\n", m_string.c_str());
}
};

测试:

int main()
{
IVariant* int_var = new Variant<int>(100);
IVariant* dbl_var = new Variant<double>(100.0f);
IVariant* str_var = new Variant<std::string>("the value is 100\n");

int_var->print_value();
dbl_var->print_value();
str_var->print_value();

delete int_var;
delete dbl_var;
delete str_var;
}

删除运算符仅从基指针就正确地知道 int_var = variant<int>所以释放了 4 个字节,dbl_var = variant<double>所以释放了 8 个字节,str_var = variant<std::string>所以它释放了 28 个字节。

但是它是怎么知道的呢? new 运算符是否存储删除运算符随后可以用来释放正确字节数的大小和指针?我知道这就是 delete[] 对数组的作用,但是当涉及到派生类时我找不到任何信息

最佳答案

deletedelete[] 运算符知道分配的大小,因为运算符 newnew[] 在分配时为他们保存一些内务信息。它使用与malloc/free对相同的思想,当mallocfree所需的大小信息保存到做它的工作。

计算分配大小与分配内存的类型无关。运算符 deletedelete[] 甚至不知道要删除的指针的类型,因为它们对 void 指针进行操作。

关于c++ - delete 如何从基指针知道派生类的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42284069/

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