ker*_*l22 8 c++ operator-overloading new-operator delete-operator
我正在尝试如下所示的代码:
class Example {
public:
Example(int val = 0) : m_val(val) { }
~Example() { }
void* operator new (std::size_t sz) {
std::cout << "Example created on the heap with size " << sz << std::endl;
return std::malloc(sz);
}
void* operator new[] (std::size_t sz) {
std::cout << "Example created on the heap with size " << sz << std::endl;
return std::malloc(sz);
}
void operator delete (void* ptr) noexcept {
std::cout << "Deleted from the heap" << std::endl;
std::free(ptr);
}
void operator delete[] (void* ptr) noexcept {
std::cout << "Deleted from the heap" << std::endl;
std::free(ptr);
}
private:
int m_val;
};
Run Code Online (Sandbox Code Playgroud)
从 main 中,我尝试new[]通过调用以下代码片段来测试运算符main
Example* p_example = new Example[4];
Run Code Online (Sandbox Code Playgroud)
预期的输出是 16,即 4 倍sizeof(int)(因为该类只有一个 4 字节m_val成员变量)。然而终端上的输出是:
Example created on the heap with size 24
Run Code Online (Sandbox Code Playgroud)
现在,当我注释掉该类的析构函数时,输出就是人们所期望的。因此带有注释的析构函数的输出是:
Example created on the heap with size 16
Run Code Online (Sandbox Code Playgroud)
vtable我通过添加虚拟函数消除了为指针分配额外 8 个字节的可能性。在这种情况下,分配的总内存比原始内存(24 字节)多了 8 字节,因此额外分配的 8 字节内存仍在分配,所以我相信这不是由于遗产。
我无法弄清楚在这个特定示例中额外的 8 个字节分配在哪里,因此任何有关相同的提示将不胜感激。我尝试使用 gdb 进行调试并查看某处是否存在任何额外变量,但我没有注意到任何异常情况。谢谢!
| 归档时间: |
|
| 查看次数: |
119 次 |
| 最近记录: |