作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我很好奇 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[] 对数组的作用,但是当涉及到派生类时我找不到任何信息
最佳答案
delete
和 delete[]
运算符知道分配的大小,因为运算符 new
和 new[]
在分配时为他们保存一些内务信息。它使用与malloc
/free
对相同的思想,当malloc
将free
所需的大小信息保存到做它的工作。
计算分配大小与分配内存的类型无关。运算符 delete
和 delete[]
甚至不知道要删除的指针的类型,因为它们对 void
指针进行操作。
关于c++ - delete 如何从基指针知道派生类的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42284069/
我是一名优秀的程序员,十分优秀!