问个简单有关问题,new 对象与直接创建对象的区别

问个简单问题,new 对象与直接创建对象的区别.
比如说:
#include <iostream>
#include <string>
class test
{
public:
int height,weight;
public:
void Show()
{
std::cout<<"Hello"<<std::endl;
}
public:
~test()
{
std::cout<<"销毁对象"<<std::endl;
}
};

int main(void)
{
test t1; //直接声明对象变量
test *pt = new test(); //动态分配创建 分配对象指针
pt->Show();
delete pt; //需要用delete显示的关闭 system("pause");
return 0;
}

但是t1为什么没有delete这样的函数 难道说他不用显示关闭吗??他们之间有什么区别啊.
t1 创建对象变量也会占用内存,难道他的内存不用回收???

初级的菜鸟问题,刚学 望各位多多指点.


------解决方案--------------------
一个在栈上, 一个在堆上。 栈由系统维护, 不需要手工释放。 堆由你自己维护, 需要手动释放
------解决方案--------------------
new调用了对象的构造函数.
------解决方案--------------------
但是t1为什么没有delete这样的函数 难道说他不用显示关闭吗??他们之间有什么区别啊. 
t1 创建对象变量也会占用内存,难道他的内存不用回收??? 


t1在mian结束后会自动释放,new出来的不会自动释放,所以你要自己delete
------解决方案--------------------
test t1; //直接声明对象变量 
在栈上分配的内存,由系统分配,生命周期结束后系统给释放!

test *pt = new test(); //动态分配创建 分配对象指针
在堆上分配内存,自己维护,delete释放
------解决方案--------------------
又是堆栈问题啊~~~~
main也只是一个函数,它有自己的栈,函数里面声明的东西都放在他的栈上,当main函数结束的时候,它自己会先把自己的栈清空,所以那些声明的东西都被清理了。但是new的东西,是放在另外一个堆上的,(这里的)main函数不会清空堆上的空间,所以new出来的东西还在堆上,所以你要在适当的时候,自己去delete,不然那块堆内存就一直存在,内存就泄露了。
------解决方案--------------------
冒失的说一句,如果我都用 student test ;来声明对象变量,也就是把所有对象都保存在栈中,这样不用显示的 new 或delete,但是这样会不会当 对象足够多的时候 栈放不下去啊.
=======================================================================
会, 实际上, 大多数的OO的程序语言, 都不允许把对象创建在栈上, 必须要在堆中创建。
C++允许在栈上创建对象, 是一个特例。
------解决方案--------------------
局部变量在栈上,其内存的分配是由编译器处理的,因此他的析构和内存的释放也是由编译器来完成的.编译器保证这种对象在生存期内总是有效的,并保证在离开生存期时,释放对象所占用的资源.

而自己new出来的对象位于堆上,他的生存期,以及内存的释放都是由程序员来完成的,编译器不提供任何保证(除非用__gc来声明),因此要特别小心.防止内存泄露.
------解决方案--------------------
冒失的说一句,如果我都用 student test ;来声明对象变量,也就是把所有对象都保存在栈中,这样不用显示的 new 或delete,但是这样会不会当 对象足够多的时候 栈放不下去啊.

当然会因为对象太多而放不下,就算用new,在对象太多的情况下,也会出现放不下的现象.默认情况下栈的大小是1M.
------解决方案--------------------
这里学的东西不少哦