今天写作业 :o ,想通过写一个函数createLine来创建一条直线于是开写
FUCK出错了。。而且是内存问题,后来找到了这段函数,想了想,发现栈中的m_line对象貌似已经消亡,返回的指针指向的对象不存在。。。怎么该。。想了想别用指针了于是乎写了下面的代码
成功了,发现好土,真的好土,不过可以实现,因为return 的是line的复本。有没有什么高端的方法去实现呢。
看似很专业的写法,堆中创建对象,呵呵,但是发现在函数体外部想delete返回的指针编译出错。。看来编译器无法识别指针指向的对象。。额,这样的话堆中对象无法回收,内存泄漏了。。。再看
返回堆中对象的复本,显然堆中对象已经找不到了,失败,再看
按别名返回,但是有一个问题,P指向的对象不存在,别名line为空,所以当我们对line操作时,会出现异常,这种异常既不会使程序崩溃,而且不易察觉
最后。。发现其实想要创建一个对象,何不写一个类,然后把代码写在构造函数里呢。。真是白学了。。
m_line* CGrahamView::createLine(CPoint i, CPoint j)
{
m_line* line;
line->i=i;
line->j=j;
line->a=i.y-j.y;
line->b=j.x-i.x;
line->c=i.x*j.y-j.x*i.y;
return line;
}
FUCK出错了。。而且是内存问题,后来找到了这段函数,想了想,发现栈中的m_line对象貌似已经消亡,返回的指针指向的对象不存在。。。怎么该。。想了想别用指针了于是乎写了下面的代码
m_line CGrahamView::createLine(CPoint i, CPoint j)
{
//m_line *line=new m_line();
m_line line;
line.i=i;
line.j=j;
line.a=i.y-j.y;
line.b=j.x-i.x;
line.c=i.x*j.y-j.x*i.y;
return line;
}
成功了,发现好土,真的好土,不过可以实现,因为return 的是line的复本。有没有什么高端的方法去实现呢。
m_line* CGrahamView::createLine(CPoint i, CPoint j)
{
m_line *line=new m_line();
line->i=i;
line->j=j;
line->a=i.y-j.y;
line->b=j.x-i.x;
line->c=i.x*j.y-j.x*i.y;
return line;
}
看似很专业的写法,堆中创建对象,呵呵,但是发现在函数体外部想delete返回的指针编译出错。。看来编译器无法识别指针指向的对象。。额,这样的话堆中对象无法回收,内存泄漏了。。。再看
m_line CGrahamView::createLine(CPoint i, CPoint j)
{
m_line *line=new m_line();
line->i=i;
line->j=j;
line->a=i.y-j.y;
line->b=j.x-i.x;
line->c=i.x*j.y-j.x*i.y;
return *line;
}
返回堆中对象的复本,显然堆中对象已经找不到了,失败,再看
m_line& CGrahamView::createLine(CPoint i, CPoint j)
{
m_line *line=new m_line();
line->i=i;
line->j=j;
line->a=i.y-j.y;
line->b=j.x-i.x;
line->c=i.x*j.y-j.x*i.y;
return *line;
}
m_line& line=createLine(pt1,pt2);
m_line *p=&line;
delete p;
按别名返回,但是有一个问题,P指向的对象不存在,别名line为空,所以当我们对line操作时,会出现异常,这种异常既不会使程序崩溃,而且不易察觉
最后。。发现其实想要创建一个对象,何不写一个类,然后把代码写在构造函数里呢。。真是白学了。。