注册 登录
编程论坛 C++教室

C++ 用new和非new来创建对象的区别

小码农 发布于 2015-06-02 22:08, 1200 次点击
C++创建对象时
程序代码:

#include <iostream>
using namespace std;

class A
{
private:
    int n;
public:
    A(int m):n(m)
    {
    }
    ~A(){}
    void fun();
};

int main()
{
    A a(1);  //栈中分配
    A b = A(1);  //栈中分配
    A* c = new A(1);  //堆中分配
  delete c;
    return 0;
}


代码里面的注释是网上别人写的,想问下对不对?如果是这样的话,第一种情况,在栈中分配,那么类中的成员函数又要存在哪里?大家讨论下^_^
8 回复
#2
诸葛欧阳2015-06-02 23:49
类的成员函数被所以该类的对象所共享,其生存期就是与类的生存期一个相同,我觉得应该在栈中
#3
wp2319572015-06-03 08:00
我认为这几条注释没啥问题
#4
w2009w2015-06-03 11:00
是不是用new创建的对象可以及时释放内存空间,减少内存的占用。
#5
yangfrancis2015-06-03 14:37
new专门用于堆中建立对象,用完之后对应一个delete来释放空间。
#6
小码农2015-06-03 23:56
回复 2楼 诸葛欧阳
内存中的栈是不是跟我们数据结构中的栈不一样啊,内存中的栈是怎么放数据的啊,函数又怎么放。
#7
wmf20142015-06-04 05:03
数据结构中是没有栈的。
数据结构是程序设计者定义的,编译时,如果没有定义对应的数据结构变量,定义的数据结构是不占任何内存的,如果有对应的变量,编译器会根据你的要求在相应内存位置开辟一段大于或等于该结构定义的大小的内存空间。
栈是cpu管理使用内存的一种手段,每个程序运行时都会分配一段内存作为栈使用,栈中数据特点是先进后出,和使用他的函数、进程生存期相同。
经验证:如果向定义局部变量一样定义类,类的方法(函数)的位置也是在栈中。
#8
TonyDeng2015-06-04 10:53
所有new出来的对象,都在堆中。

1楼的代码,你困惑的地方应是这一句:
A* c = new A(1);  //堆中分配
这里A是一个指针(虽然这里的命名有点怪,与类同名,但不影响原理解释),它指向的就是堆中的对象,那个对象是依据类A为模板创建出来的,这个对象所有的数据都在堆上。

其他的语句,是在栈上创建对象。是对象在栈上还是堆上的问题,你实际上只要把class A视为int就一切都明白。记住:C++中class是定义一个数据类型,其地位与int、double等完全一样。

[ 本帖最后由 TonyDeng 于 2015-6-4 10:55 编辑 ]
#9
诸葛欧阳2015-06-04 13:23
数据结构中的栈其实就是我们自定义的一种数据类型或者说是一个类
1