创建一个类会抛出一个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
答案 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可能更为可取,因为它并不要求你删除它; ,虽然技术上可行,但对某些人来说可能看起来没什么吸引力。