C++ 在覆盖新运算符和删除运算符时不释放数据



>我全局替换了new和delete运算符进行调试,我得到了奇怪的行为,看起来C++调用删除时没有释放数据。

最少的错误代码:

#include "stdlib.h"
#include "stdio.h"
// Classes
class A
{
    int i;
public:
    A() { printf("Created An"); }
    virtual ~A() { printf("Destroyed An"); }
};
class B : public A
{
    int j;
public:
    B() { printf("Created Bn"); }
    ~B() { printf("Destroyed Bn"); }
};
unsigned int num_allocs = 0;
// Custom new/delete
void* operator new(size_t size)
{
    void* p = malloc(size);
    printf("[+] %p (%u)n", p, size);
    num_allocs += 1;
    return p;
}
void operator delete(void* p)
{
    printf("[-] %pn", p);
    num_allocs -= 1;
    free(p);
}
struct Z
{
    int k;
};
int main()
{
    printf("Startedn");
    A* a = (B*)(new B);
    Z* z = new Z;
    printf("Will deleten");
    delete a;
    delete z;
    printf("Finishedn");
    printf("Allocs: %un", num_allocs);
    return 0;
}

输出(在Windows上使用MSYS2 + MinGW32编译):

开始

[+] 003e1a50 (12)

创建了一个

创建 B

[+] 003e8630 (4)

将删除

被摧毁的B

摧毁了 A

完成

分配: 2

还剩 2 个分配!为什么???

编辑1:当我使用-std=c++98或-std=c++11标志时,错误消失,标志-std=c++

14和-std=c++1z重现错误。

它调用不同的delete函数。 您应该提供以下定义:

void operator delete(void* ptr, std::size_t size);

使用 C++17 时,还应noexcept delete两个函数。

相关内容

  • 没有找到相关文章

最新更新