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 后,您可以执行以下两项操作之一:

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 回答