繁体   English   中英

为什么在创建指针类型对象时内存没有分配给类?

[英]Why memory is not allocated to class when we create pointer type object?

我有点好奇为什么在创建指针类型对象时内存没有分配给类或结构?

例如 :-

class A
{
    public:

    void show()
    {
        cout<<" show function "<<endl;  
    }

};
int main()
{
A *a;
a->show();
   return 0;
};

因为指针和内存分配是先验完全无关的。 实际上,在现代C ++中,使用指针直接指向手动分配的内存是非常糟糕的

在大多数情况下,指针指向现有对象 - 这是它们的目的:提供间接性 重申一下:这与内存分配完全无关。

如果你想直接拥有一个对象,你不需要一个指针:只需按原样声明对象(= by value):

A a;
a.show();

这段代码:

A *a;
a->show();

声明一个A*类型的指针。 仅仅指针只是一个变量,它在其中包含一些内存的地址,即它只是指向某个地方,没有别的。 类型A*指针意味着它指向内存,其中期望找到类型A的实例。

a->show(); 然后只是依赖于这种“期望”,但事实上它只是使用未初始化的指针,这会导致未定义的行为


这可以通过动态创建A的实例来解决:

A *a = new A();
a->show();

(然而,通过调用delete a; )甚至更好地给你清理这个内存带来了不愉快的责任:使用具有自动存储持续时间的对象:

A a;
a.show();

在第二种情况下,类型A的实例是自动创建的,其生命周期与创建它的范围相关联。 一旦执行离开此范围, a遭到破坏和内存被释放。 所有这一切都得到了照顾,你根本不用担心它。

分配指针并不等于分配对象。 您需要在堆上使用new并实例化对象,或者在堆栈上创建对象:

A* a = new A();
// Or
A a;
A* aPntr = &a;

指针不是一个对象,它只是指向某个地方的链接。 使用它们的原因是您可以动态地更改它们指向的内容。

A a;
A b;
A *pA;

{
    bool condition;
    // set condition here according to user input, a file or anything else...

    if(condition)
        pA = &a;
    else
        pA = &b;
}

现在我不必关心条件,它甚至不再存在,我仍然可以从上面做出的选择中获益。

pA->show();

或者我可以使用指针迭代数组:

A array[10];
for(A* pA = array; pA < array+10; pA++)
{
    pA->show();
}

(注意我在两个例子中都使用了class A的原始声明,如果AA每个对象都包含其特定信息,则更有意义。)

A *a;可能没有一个单一的原因A *a; 不要分配A的实例。 这与C ++的设计方式不一致。 如果Stroustrup认为它足够长的时间来确定不这样做的明确理由,我会感到有些惊讶。

几种不同的方式来看待它:

  1. 你没有要求A型物体,所以你没有得到它。 这就是C和C ++的工作方式。
  2. 指针对象是保存地址的对象。 您也可以问为什么固定制造商在制造信封时不会建造房屋,因为当您定义指针时,问为什么C ++不会分配要指向的对象。
  3. 分配内存的方法有很多种。 假设要分配内存,你想要哪一个? 你可以说,在C ++中, new对于类类型来说是一个合理的默认值,但是如果char *c;它可能会非常混乱char *c; 调用new char (因为行为与C不同)或char *c; 根本没有分配内存(因为行为与char *A;不同char *A;
  4. 如何以及何时释放内存? 如果它被分配了new则有人将不得不调用delete 如果每个delete对应一个new ,而不是每个delete对应于new或定义具有隐式内存分配的指针,则更容易保持直接。
  5. 指针可以是对象的位置,但并不总是(有时它是null,有时它是数组的末尾)。 该对象可以动态分配,但不一定是。 在不需要它的情况下,使指针指向对象是非常无益的语言。 因此,该语言为您提供了在定义指针时不分配内存的选项。 如果您不希望这样,那么您应该使用您选择的内存分配机制调用的结果初始化指针。

您只需创建指针* a,但不为其分配内存。

你应该使用A * a = new A();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM