Operator delete[](重载)和析构函数连接

问题描述 投票:0回答:0

所以我有一个类,我在其中使用重载运算符 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 保留的所有内存。

c++ visual-c++
© www.soinside.com 2019 - 2024. All rights reserved.