今天写作业
,想通过写一个函数createLine来创建一条直线于是开写
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操作时,会出现异常,这种异常既不会使程序崩溃,而且不易察觉
最后。。发现其实想要创建一个对象,何不写一个类,然后把代码写在构造函数里呢。。真是白学了。。
分享到:
相关推荐
在主函数中,创建了一个`Stack<int>`对象`ob1`,并进行了元素的`push`、`traverse`以及`pop`操作,展示了栈类的实际使用。 ### 总结 通过上述分析,我们可以看到,C++中的栈类是通过模板实现的,允许我们灵活地...
禁止创建栈对象,意味着只能在堆上创建对象。创建栈对象时会移动栈顶指针以“挪出”适当大小的空间,然后在这个空间上直接调用类的构造函数以形成一个栈对象。而当栈对象生命周期结束,如栈对象所在函数返回时,会...
1、C++创建对象方式 在C++中我们可以采用如下两种方式来创建对象, 1 Dog dog;//Dog为类名 2 Dog *p = new Dog(); 这两种方式在C++中都能完成对象的创建,但是在内存中的处理却完全不同。 对于...
### C++中的静态存储区、栈与堆的区别 在C++编程语言中,根据变量的存储方式和生命周期,可以将内存区域大致分为四个部分:静态存储区、栈、堆以及未初始化的数据段(BSS)。其中,静态存储区、栈与堆是程序运行时...
C++提供了堆和栈两种内存分配方式。栈内存由编译器自动管理,用于存储局部变量和函数调用信息;而堆内存则需要程序员手动管理,通过new和delete操作进行分配和释放。不正确的内存管理可能导致内存泄漏或悬挂指针,这...
本文将深入探讨C++中的堆、栈以及静态数据区,帮助理解这些内存区域的区别和使用场景。 1. 栈(Stack): 栈是编译器自动管理的内存区域,主要用来存放函数参数、局部变量等。每当进入一个函数调用,栈就会为函数的...
本文将通过两种不同的编程方法来实现栈这一数据结构,一种是使用C语言的传统指针方式,另一种则是利用C++的面向对象特性。这两种方法各有优势,能够帮助初学者更好地理解和掌握栈的原理以及在实际编程中的应用。 ##...
在本项目中,我们主要探讨的是使用C++编程语言实现一个基于数据结构栈的计算器,并结合QT库创建用户界面(UI)。以下是对每个关键概念的详细说明: **C++** C++是一种强大的、通用的编程语言,具有面向过程和面向...
2. **构造与析构**:在C++中,构造函数用于初始化新创建的对象,而析构函数则在对象生命周期结束时执行,通常用于释放资源。理解这两者对于有效管理内存至关重要。 3. **内存管理**:C++提供了两种主要的内存区域...
类的静态数据成员不需要在创建对象时初始化,而是由类的所有对象共享的。 - **友元函数**:不是类的成员函数,但它可以访问类的私有和保护成员(题目9)。友元函数不需要通过对象名访问成员,但必须被声明为友元...
在C++编程语言中,创建对象是面向对象编程的基础,主要分为两种方法:栈上的对象创建和堆上的对象创建。 **方法一:栈上创建对象** 这是C++中最常见的对象创建方式,通常在函数内部使用。语法形式如下: ```cpp ...
在编程世界中,创建对象是实现面向对象编程的基础。本文将深入探讨两种常见的对象创建方式:使用`new`关键字创建对象和直接定义对象。这两种方法虽然最终都能创建类的实例,但它们在内存分配、作用域和生命周期等...
本文将深入解析一个C++中的栈类模板实现,并通过实例演示如何利用该模板来创建不同类型的栈(如整数栈、字符栈和浮点数栈)。栈是一种线性数据结构,遵循后进先出(LIFO, Last In First Out)的原则。在C++中,通过...
- 内存模型:探讨了堆和栈内存,以及静态和动态存储期的对象。 - 虚函数与虚函数表:详细介绍了虚函数的工作原理,包括虚函数表的构造和查找过程。 - 继承与覆盖:讨论了继承的特性,如私有继承、保护继承和公有继承...
1. **对象与类**:在C++中,类是创建对象的蓝图,它定义了一组数据成员(变量)和成员函数(方法)。对象是类的实例,具有类所定义的属性和行为。创建对象时,内存会分配给对象的数据成员,并可以调用成员函数来操作...
- 默认构造函数`mystack()`:默认创建一个最大容量为100的栈。 - 带参数构造函数`mystack(int size)`:用户可以指定栈的最大容量。 - 复制构造函数`mystack(const mystack<T>& copy)`:用于拷贝另一个栈对象。 -...
在C/C++编程中,如上述部分代码所示,局部变量`int b`和数组`s[]`是在栈上分配的,而通过`malloc()`或`new`操作符分配的`p1`和`p2`则位于堆上。静态变量`static int c`虽然在全局空间,但也属于静态存储类别,不同于...