菜单问题

来源:互联网 发布:小提琴谱软件 编辑:程序博客网 时间:2024/05/17 23:21

菜单是通过事件触发(左键)生成的窗体.一般用指针来生成,不用栈变量.因为栈变量出了作用域就会析构,窗体会消失.如果用New的方式来Show,那么如何管理生成的指针就是一个问题.

1. 可以把Menu作用一个局部类的内部成员,在局部类消毁的时候一起消毁;

2. 用全局指针变量

 

使用全局指针变量,如果有多个菜单,那么这个指针的管理很麻烦.尤其是最后怎么delete是个问题!duilib工程中Menu使用了一个观察者/接收者模式.每一个Menu指针是一个接收者,生成时通过观察者加入这个接收者.最后在窗口过程执行最后一个函数时消毁(如WM_NCDESTROY消息)

或者直接用delete this.

 delete p 是一个两步的过程:调用析构函数,然后释放内存。delete p产生的代码看上去是这样的(假设是Object*类型的):

delete原语可以看作如下这样一个过程:
p->~Object();
p->operator delete(p);

p->~Object() 语句调用p指向的Object对象的析构函数。
p->operator delete(p) 语句调用对象p的内存释放原语 void operator delete(void* p)。如果没有实现该方法,将调用系统的内存释放原语::operator delete(ptr)做释放该对象内存的操作。

成员函数调用delete this合法吗?
只要你小心,一个对象请求自杀(delete this),是可以的。

以下是我对“小心”的定义:

你必须100%的确定,this对象是用 new分配的(不是用new[],也不是用定位放置 new,也不是一个栈上的局部对象,也不是全局的,也不是另一个对象的成员,而是明白的普通的new)。

你必须100%的确定,该成员函数是this对象最后调用的的成员函数。

你必须100%的确定,剩下的成员函数(delete this之后的)不接触到this对象任何一块(包括调用任何其他成员函数或访问任何数据成员)。

你必须100%的确定,在delete this之后不再去访问this指针。换句话说,你不能去检查它,将它和其他指针比较,和NULL比较,打印它,转换它,对它做任何事。

自然,对于这种情况还要习惯性地告诫:当你的指针是一个指向基类类型的指针,而没有虚析构函数时(也不可以delete this)。

注意:因为是在类成员函数里面delete this的,所以在此语句以后,不能访问任何的成员变量及函数(调用虚函数必须对象实例存在以检查类型),否则一定非法。

上面所说的在执行时不一定会报错,但尽量不要这么做。

 代码段不会被释放,释放内存只释放数据段 

#include <iostream>using namespace std;class A{public:    A()     {        cout << "A()" << endl;    }    ~A()     {        cout << "~A()" << endl;    }    int get(int)    {        cout << "A::get(int)" << endl;        return 5;    }#if 0    void operator delete(void* ptr)    {        cout << "A::delete()" << endl;    }#endif};int main(){    A* ptr = new A();#if 0    ::operator delete(ptr);    delete ptr;#else    A::A();    delete ptr;    cout << "code is " << ptr->get(1) << endl;#endif}


 

0 0
原创粉丝点击