2017-11-08 9 views
0

新しい演算子と削除演算子をデバッグのためにグローバルに置き換え、異常な動作をしています。C++は新規と削除の演算子をオーバーライドするときにデータを解放しません

エラーと最小限のコードを:

B

[+]を作成

を作成

[+] 003e1a50(12)

スタート

#include "stdlib.h" 
#include "stdio.h" 

// Classes 
class A 
{ 
    int i; 
public: 
    A() { printf("Created A\n"); } 
    virtual ~A() { printf("Destroyed A\n"); } 
}; 
class B : public A 
{ 
    int j; 
public: 
    B() { printf("Created B\n"); } 
    ~B() { printf("Destroyed B\n"); } 
}; 

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("[-] %p\n", p); 
    num_allocs -= 1; 
    free(p); 
} 

struct Z 
{ 
    int k; 
}; 

int main() 
{ 
    printf("Started\n"); 
    A* a = (B*)(new B); 
    Z* z = new Z; 
    printf("Will delete\n"); 
    delete a; 
    delete z; 
    printf("Finished\n"); 
    printf("Allocs: %u\n", num_allocs); 
    return 0; 
} 

Output (Compiling with MSYS2 + MinGW32 on Windows):

003e8630(4 )

破壊B

破壊

終了

Allocs削除されます:2

2 allocations remaining! WHY???

EDIT1:Iを使用すると-std = C++ 98または-std = C++ 11フラグを指定すると、エラーがなくなり、フラグ-std = C++ 14および-std = C++ 1zがエラーを再現しますror。

+0

「オペレータの削除」が呼び出されていないようです。 –

+0

私はそれを再現できません:http://coliru.stacked-crooked.com/a/69ceb5d26a07b48f – Amadeus

+0

'A * a =(B *)(new B);'なぜここにキャストしますか? –

答えて

0

別のdelete関数を呼び出しています。あなたはC++ 17を使用する場合は、両方のdelete機能もnoexceptあるべき

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

の定義を提供する必要があります。

+0

新しい[]を定義して[]を削除する必要がありますか?これはデバッグビルドの場合のみです – rmalizia44

+0

@ rmalizia44それらを使用している場合は、それらを定義する必要があります。それ以外の場合は、ライブラリに含まれているグローバルなものを使用します。 – 1201ProgramAlarm

+0

ありがとう、あなたは私の問題を解決しました! – rmalizia44

関連する問題