0

作成されたクラスにキーワードとそれを指すポインターをスローnewさせ、次にクラスからメソッドを呼び出してクラス自体を破棄する場合、ポインターからメモリを解放する必要がありますか?そのような何か:

.h

#include <list>
#include <iostream>
class Test
{
public:
    Test();
    ~Test();
    void destroy();
    bool operator==(Test& right){return id == right.id;};
private:
    static int count;
    std::list<Test*>::size_type id;
    static std::list<Test*> instances;
};

.cpp

#include "Test.h"
int Test::count = 0;
std::list<Test*> Test::instances;
Test::Test()
{
    instances.push_back(this);
    id = count++;

}
Test::~Test()
{
}

void Test::destroy()
{
    for(auto t : instances){
        if(*t == *this)
        {
            delete t;
            break;
        }
    }
}

ソース

Test* n = new Test();
n->destroy();

だから私の質問は、nが指すメモリが解放されるということですか?または私は電話する必要がありますdelete n

4

2 に答える 2

1

これは機能しますが、なぜこのようにするのですか?なぜだけではないのdelete nですか?

于 2013-02-07T01:05:21.817 に答える
0

これは、誰かが後でこれを見つけた場合に備えて、コメントで説明されていることです。

基本的に、Windowsのウィンドウメカニズムをカプセル化しようとしていて、WM_DESTROYのウィンドウクラスを破棄したいようです。

HWNDからクラスにマップするマップがあります。

        map<HWND,CLASS*> instances;

WM_DESTROYを受信すると、次の2つのいずれかを実行できます。

1.機能オプションを破棄します

 instance[hwnd]->destroy();

destroyの内部には、次のようなものがあります。

void CLASS::destroy() {
     // assuming hwnd is a member (probably m_hwnd)
     instance.erase(hwnd);  
     // do some cleanup, and then delete the instance
     delete this;
}

2.削除オプション

delete instance[hwnd];
instance.erase(hwnd);

この場合、すべてのクリーンアップコードをクラスのデストラクタに配置する必要があります。

オプション2は、これを削除する必要がないため、おそらくより望ましいです。、技術的には問題ありませんが、一部の人にとっては魅力的ではないように見える場合があります。

于 2013-02-07T02:26:44.023 に答える