以前一直是用C#做一些小程序(自学编程的菜鸟)进入工作单位以后需要用C++做一些GIS算法和功能的开发,然后就转到C++的道路上来了,以前做项目的经验比较少对底层内存的一些关系理解也不透彻到现在就比较挠头了,只能老老实实的一个坑一个坑的慢慢爬了。看到大神写博客分享知识、记录学习我也来试试,争取每周写一篇收获的东西,也对自己学习的知识做一个总结也鼓励自己每周学点新东西。
因为现在都是采用面向对象编程方法,对象占用内存的开辟和释放会影响软件运行时占用的资源,所以这个问题很基础也很重要。原来才用C#语言做的一些桌面的小程序这个问题并不突出,而且.net环境下有一个内存自动回收机制,基本不用考虑对象占用内存的释放问题,而C++中主要通过指针使用对象的内存,自己开辟的对象占用空间需要主动释放,直接把C#编程中的一些“习惯”直接套用就发现了不少问题。首先碰到问题是类的构造函数调用在什么时候调用的问题以及对象的拷贝问题。
在c#控制台程序写了下面的代码:
class A
{
private static int i = 0;
public A()
{
Console.WriteLine("调用C#类的构造函数{0}",i++);
}
}
class Program
{
static void Main(string[] args)
{
A example1;
A example2 = new A();
example1 = example2; //example2 = example1;
}
}
在c++控制台写一下的代码:
class B
{
public:
B();
~B();
private:
static int i;
};
int B::i=0;
B::B()
{
cout<<"C++中调用类的构造函数"<<i++<<endl;
}
B::~B()
{
}
int _tmain(int argc, _TCHAR* argv[])
{
B b1;
B *b2=new B();
b2= &b1; //b2= b1或b1= b2 这样写会报错
return 0;
}
可以看出两者猛地一看何其相似,仔细思考却能下出一身冷汗,C++中声明对象变量不需要用new关键字(智能提示会报错),同时会直接调用构造函数初始化对象,new关键字用来显式地开辟一个对象指针的内存空间;而C#中如果不使用new关键字,那么对象的值是NULL,换句话说C#中必须明确的告诉系统我需要一个对象的内存空间系统才会给内存空间。
为什么觉得这么简单的问题需要总结一下,主要是本人用c#码代码的时候经常有这样的习惯:
B b;
//*******业务逻辑运算*******//
if(b!=null){/******进行某些操作....********/}
刚开始用C++的时候也总有这样的“习惯”,刚开始是去改别人的软件工具,一堆的代码不知道是哪里的问题,一步步的跟才发现是自己一开局就错了,先写个总结记录一下,内容简单也是进步。
欢迎各位大神留步指点菜鸟一二!!