所以我有一个类,我在其中使用重载运算符 new[] 和 delete[] 来跟踪分配和释放了多少内存。
class TvectorPublic
{
public:
int x, y, z;
TvectorPublic(int x_1 = 0,int y_1 = 0,int z_1 = 0) : x(x_1),y(y_1),z(z_1)
{}
void m_DoubleValue()
{
x *= 2;
y *= 2;
z *= 2;
}
void m_AddingValue(int value)
{
x += value;
y += value;
z += value;
}
void* operator new[](size_t size_1)
{
std::cout << "Creating TvectorPublic object.\n";
std::cout << "Reserving memory: " << size_1 << " bytes.\n";
return (::new char[size_1]);
}
void operator delete[](void* pointer, size_t size_1) noexcept
{
if (pointer)
{
std::cout << "\nDeleting TvectorPublic object.\n";
std::cout << "Freeing memory: " << size_1 << " bytes.\n";
::delete[] static_cast<char*>(pointer);
}
}
};
在函数 main() 中,我定义了一个此类的对象数组:
TvectorPublic* pointer_1 = new TvectorPublic[3];
std::cout << "\n";
for (int i = 0; i < 3; i++)
{
std::cout << pointer_1[i] << "\n";
}
std::cout << "\n";
delete[] pointer_1;
输出是保留的内存是36字节,释放的内存只有12字节。 定义析构函数后问题似乎消失了:
~TvectorPublic()
{
std::cout << "DestructorCalled\n";
}
则输出为:Memory reserved: 40 bytes, memory freed: 40 bytes。 我的问题是关于析构函数和此运算符删除之间的相关性。为什么没有析构函数会发生内存泄漏,为什么编译器在这种情况下不生成默认值?为什么使用此析构函数保留的内存要大 4 个字节(除了直观地表示销毁此数组中对象的过程外,它实际上什么都不做)。为什么只有在添加此析构函数后,保留的整个内存才会被释放?这让我很困扰,因为我看不到析构函数和运算符 delete 之间的任何联系,除了 delete 正在调用什么都不做的析构函数。当在主函数中我没有创建对象数组而是创建单个对象时,问题不存在。然后即使没有构造函数,它也会释放 operator new 保留的所有内存。