C ++指向类和破坏类的指针

时间:2013-02-07 01:01:24

标签: c++ pointers

创建一个类会抛出一个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

2 个答案:

答案 0 :(得分:1)

这会有效,但为什么会这样呢?为什么不只是delete n

答案 1 :(得分:0)

这是评论中讨论的内容,以防有人稍后发现。

基本上,看起来你正试图封装Windows&#39;窗口机制,并希望破坏WM_DESTROY上的窗口类。

您有一张从HWND映射到班级的地图:

        map<HWND,CLASS*> instances;

收到WM_DESTROY后,您可以执行以下两项操作之一:

<强> 1。销毁功能选项

 instance[hwnd]->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可能更为可取,因为它并不要求你删除它; ,虽然技术上可行,但对某些人来说可能看起来没什么吸引力。