动态地为类分配内存

时间:2016-01-28 08:11:17

标签: c++ pointers memory memory-management

我很清楚在C ++中为struct动态分配内存。

struct Node
{
    int item;
    struct Node *next;
};

int main()
{
    struct Node *head = new struct Node;
    return 0;
}

这是一张照片。

enter image description here

堆中分配了8字节内存,head是指向它的指针。

但是当我遇到动态分配内存的时候,有几个问题困扰了我很久。有一个例子:

class Example
{
private:
    int a;
    double b;
public:
    virtual void fun();
    void fun2();
};

int main()
{
    Example *e = new Example;
}

void Example::fun()
{
}

我的问题是:

1.我知道系统为int分配内存并在堆中分配双倍,系统是否还为堆中的fun()和fun2()分配内存?如果没有,哪里有趣()和 fun2()存储在应用程序内存中?

2.堆中分配了多少字节?

3.指针e如何取消引用fun()或fun2()函数?

4.取消引用正常功能与取消引用虚拟功能之间的区别是什么?

1 个答案:

答案 0 :(得分:2)

首先,classstruct与C ++等效,唯一的区别是结构的默认访问修饰符为public,而privatestruct Node一类。 Node的数据类型仅为Node *head = new Node;,因此struct就足够了,无需在任何地方重复sizeof(Example)

  

1.我知道系统为int分配内存并在堆中分配双倍,系统是否还为堆中的fun()和fun2()分配内存?如果没有,fun()和fun2()存储在应用程序内存中的哪个位置?

这些方法与所有其他函数一起驻留在代码 -block中。该方法源代码只有一个副本,而不是每个实例都有一个。

  

2.堆中分配了多少字节?

这取决于填充和对齐。 this告诉您,该类需要多少字节。

  

3.指针e如何取消引用fun()或fun2()函数?

这取决于方法是否为虚方法。如果它不是它被编译就好像它是一个常规函数,除了指向SQLException的指针也被传递(如果我没有错误,在寄存器中)。

对于虚拟功能和#4,请参阅here