类创建对象和类指针创建对象的内存表现以及区别
2017-09-21 23:01
253 查看
原地址blog.csdn.net/yiliangloveyou1270/article/details/42638443
大家好,我是一个C++的初学者,所以不免要学习一下C++的面向对象和内存机制,我自己也一直没有弄清楚一个问题:
注:Student 是一个学生类;
Student stu; (1)
Student *p_stu; (2)
Student *p_stu = 0(Student *p_stu = NULL); (3)
Student *p_stu = new Student(); (4)
这三者的区别,我一直不太清楚,下面我是我收集资料然后整理的内容:
(1) Student stu;
这就是在内存中出现的情况,系统会自动给stu对象分配一个内存,而且是在栈区,有系统自行管理;而且stu对象是一个局部对象,他的生命周期是在创建初期到函数结束,所以才使用这种情况的时候,注意生命周期问题,一般你在别的函数中需要使用到这个对象的时候,尽量不要使用这种方法创建一个对象;
(2) Stud
4000
ent *p_stu;
如下图:
这种方式是用来定义一个指向Student类的指针,且没有初始化,系统会自动分配一个内存用来存储类指针p_stu,而且里面的值此时是一个随机值。
(3)Student *p_stu = 0(Student *p_stu = NULL);
有些人就会问了,这不就是第二条么,对,却是第二条,我在这里独立开的原因是想说明一个情况:就是要初始化;
主要是我看到了一些代码,让我自己有点迷惑,所以我就加上了这一条,下面请看代码:
来自CODE的代码片
t_class_method
上面代码是我借鉴别人的,我只是拿过来说明下,在主函数中,
语句A* a = NULL; 定义一个A类指针a 并且初始化为NULL,
//TODO这里我还没有弄清楚在C++中NULL和0的区别(这里假设一样),留待以后详细说明;
代码运行之后,会输出:hello printA;
也就是说我仅仅定义一个类A的指针就可以访问类A的成员函数(除虚函数,虚函数需要对象的虚函数表),
这里为什么仅仅定义一个A类的指针就可以访问A类的成员函数,我问了一下项目经理,他没有能回答我!
//TODO(留待以后解决)
(4)Student *p_stu = new Student();
如下图:
这种方式就弥补了第一种方式的缺点,所以在C++中新建对象的时候一般使用这种情况(不绝对,因为我是新手),
但是一定要注意:new 出来的对象空间,一定要在析构函数中回收空间,或者在别的地方回收,就是使用delete关键字来回收,否则会出现内存泄露,这是一个极其需要关注的地方。
这就是我今天的收获,虽然是自己东拼西凑出来的,但是,聊胜有无吧,而且自己也多多学习,如果有错误,请多多指教,我还会继续更正里面的错误!
保持一颗上进的心,做一个真正的软件开发工程师,不做一个程序员!
大家好,我是一个C++的初学者,所以不免要学习一下C++的面向对象和内存机制,我自己也一直没有弄清楚一个问题:
注:Student 是一个学生类;
Student stu; (1)
Student *p_stu; (2)
Student *p_stu = 0(Student *p_stu = NULL); (3)
Student *p_stu = new Student(); (4)
这三者的区别,我一直不太清楚,下面我是我收集资料然后整理的内容:
(1) Student stu;
这就是在内存中出现的情况,系统会自动给stu对象分配一个内存,而且是在栈区,有系统自行管理;而且stu对象是一个局部对象,他的生命周期是在创建初期到函数结束,所以才使用这种情况的时候,注意生命周期问题,一般你在别的函数中需要使用到这个对象的时候,尽量不要使用这种方法创建一个对象;
(2) Stud
4000
ent *p_stu;
如下图:
这种方式是用来定义一个指向Student类的指针,且没有初始化,系统会自动分配一个内存用来存储类指针p_stu,而且里面的值此时是一个随机值。
(3)Student *p_stu = 0(Student *p_stu = NULL);
有些人就会问了,这不就是第二条么,对,却是第二条,我在这里独立开的原因是想说明一个情况:就是要初始化;
主要是我看到了一些代码,让我自己有点迷惑,所以我就加上了这一条,下面请看代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #include "stdafx.h"#include <iostream>using namespace std; class A{public: void printA() { cout << "hello printA" << endl; } virtual void printB() { cout << "hello printB" << endl; }}; int _tmain(int argc, _TCHAR* argv[]){ A* a = NULL; a->printA(); system("pause"); return 0;} |
来自CODE的代码片
t_class_method
上面代码是我借鉴别人的,我只是拿过来说明下,在主函数中,
语句A* a = NULL; 定义一个A类指针a 并且初始化为NULL,
//TODO这里我还没有弄清楚在C++中NULL和0的区别(这里假设一样),留待以后详细说明;
代码运行之后,会输出:hello printA;
也就是说我仅仅定义一个类A的指针就可以访问类A的成员函数(除虚函数,虚函数需要对象的虚函数表),
这里为什么仅仅定义一个A类的指针就可以访问A类的成员函数,我问了一下项目经理,他没有能回答我!
//TODO(留待以后解决)
(4)Student *p_stu = new Student();
如下图:
这种方式就弥补了第一种方式的缺点,所以在C++中新建对象的时候一般使用这种情况(不绝对,因为我是新手),
但是一定要注意:new 出来的对象空间,一定要在析构函数中回收空间,或者在别的地方回收,就是使用delete关键字来回收,否则会出现内存泄露,这是一个极其需要关注的地方。
这就是我今天的收获,虽然是自己东拼西凑出来的,但是,聊胜有无吧,而且自己也多多学习,如果有错误,请多多指教,我还会继续更正里面的错误!
保持一颗上进的心,做一个真正的软件开发工程师,不做一个程序员!
相关文章推荐
- 类创建对象和类指针创建对象的内存表现以及区别
- java中创建String类型对象的两种方式以及在使用equals()和“==”两种方法时的区别
- .Net 指针使用以及在栈上创建引用对象
- 类的内存分配以及通过内存创建对象
- 深入理解java虚拟机(二)HotSpot Java对象创建,内存布局以及访问方式
- C++用new和不用new创建类对象区别 内存
- C++ 对象和实例的区别,以及用new和不用new创建类对象区别
- 关于java基础类型与引用类型内存存储问题,以及string.intern()方法(String两种创建方式的区别)
- c/C++编译的程序占用的内存以及More Effective C++ 条款1:指针与引用的区别
- 从Java类到对象的创建过程都做了些啥以及内存中的对象是啥样的
- JAVA的StringBuffer类(转载整理)____非常重要的一个类,线程安全,不用每次创建一个对象,以及和String的区别
- HotSpot虚拟机中的对象创建以及内存分布
- Java对象在虚拟机中的创建、内存分布、访问定位以及死亡判定
- 深度理解java虚拟机读书笔记(二)HotSpot Java对象创建,内存布局以及访问方式
- JVM --- JVM的内存结构以及对象的创建和内存布局
- C++ new 创建对象加不加括号的区别以及用new创建对象的特点
- C++ 对象和实例的区别,以及用new和不用new创建类对象区别
- Java中的垃圾回收问题以及在创建对象的时候的内存的分析
- 结构体指针和结构体对象的创建、置空、赋值以及与string的转换
- JVM--运行时数据区以及对象的创建,内存布局、访问