关于C++的指针与对象
2013-01-16 16:42
316 查看
指针与对象
不管是类还是结构(其实结构是一种特殊的类),它们在创建时还是要创建内存的,但是,创建类的对象也有两种方式,直接声明和用指针来分配新实例。[cpp]
view plaincopyprint?
#include <iostream>
using namespace std;
class Test
{
public:
Test();
~Test();
void Do(char* c);
};
Test::Test()
{
cout << "Test对象被创建。" << endl;
}
Test::~Test()
{
cout << "Test对象被销毁。" << endl;
}
void Test::Do(char* c)
{
cout << "在" << c << "中调用了Do方法。" << endl;
}
void Func1()
{
Test t;
t.Do("Func1");
/*
当函数执行完了,t的生命周期结束,发生析构。
*/
}
void Func2()
{
Test* pt = new Test;
pt -> Do("Func2");
/*
用指针创建的对象,就算指针变量的生命周期结束,但内存中的对象没有被销毁。
因此,析构函数没有被调用。
*/
}
int main()
{
Func1();
cout << "---------------------" << endl;
Func2();
getchar();
return 0;
}
我们来看看这个例子,首先定义了一个类Test,在类的构造函数中输出对象被创建的个息,在发生析构时输出对象被销毁。
接着, 我们分别在两个函数中创建Test类的对象,因为对象是在函数内部定义的,根据其生命周期原理,在函数返回时,对象会释放,在内存中的数据会被销毁。理论上是这样的,那么,程序实际运行后会如何呢?
这时候我们发现一个有趣的现象,在第一个函数直接以变量形式创建的对象在函数执行完后被销毁,因为析构函数被调用;可是,我们看到第二个函数中并没有发生这样的事,用指针创建的对象,在函数完成时居然没有调用析构函数。
直接创建对象,变量直接与类实例关联,这样一来,当变量的生命周期结束时,自然会被处理掉,而用指针创建的实例,指针变量本身并不存储该实例的数据,它仅仅是存了对象实例的首地址罢了,指针并没有与实例直接有联系,所以,在第二个函数执行完后,被销毁的是Test*,而不是Test的对象,仅仅是保存首地址的指针被释放了而已,而Test对象依然存在于内存中,因此,在第二个函数完成后,Test的析构函数不会调用,因为它还没死呢。
那么,如何让第二个函数在返回时也销毁对象实例呢?还记得吗,我前文中提过。对,用delete.。
[cpp]
view plaincopyprint?
void Func2() { Test* pt = new Test; pt -> Do("Func2"); delete pt; }
void Func2() { Test* pt = new Test; pt -> Do("Func2"); delete pt; }
现在看看,是不是在两个函数返回时,都能够销毁对象。
现在你明白了吧?
由此,可以得出一个结论:指针只负责为对象分配和清理内存,并不与内存中的对象实例有直接关系。
相关文章推荐
- C++中关于指向对象成员函数打指针例子
- 关于C++项目指针对象未被初始化的问题(0xcdcdcd)
- 关于C++中对象指针的一些用法
- 关于C++项目指针对象未被初始化的问题(0xcdcdcd)
- 关于C++中父类指针引用对象在内存中的分布
- C++ 第九章 关于类和对象的进一步讨论(二)const的用法和指针数据成员
- C++ 关于在一个类中定义另一个类的指针与对象
- 这是我开通博客的原因;虽然不是什么大问题;关于指针与对象(C++)
- C++ 指向空指针的对象(关于编译时绑定和运行时绑定)
- C++关于父类指针指向子类对象的问题
- 关于C++中函数指针的使用(ZZ)
- 关于通过不含虚析构函数的基类类型的指针删除派生类对象的问题 http://blog.csdn.net/unituniverse2/article/details/12302139
- 关于C++为类增加标识符和对象DBID的解决方法
- [C++对象模型][2]指针与引用
- 关于C++函数返回局部对象的详细分析
- c++对象内存布局与c++成员函数指针
- [C++对象模型][2]指针与引用
- [转]解析C++普通局部变量与指针类型的对象变量的应用区别
- 关于C++的子类指针指向父类
- [C++对象模型][3]指针与数组