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

时间:2014-01-28 18:52:45

标签: c++ object

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

例如: -

class A
{
    public:

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

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

6 个答案:

答案 0 :(得分:10)

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

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

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

A a;
a.show();

答案 1 :(得分:4)

此代码:

A *a;
a->show();

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

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


这可以通过动态创建A

的实例来解决
A *a = new A();
a->show();

(但是通过调用delete a;)或更好的方式给你带来不愉快的责任:使用具有自动存储持续时间的对象:

A a;
a.show();

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:2)

指针不是一个对象,它只是一个指向的链接。使用它们的原因是你可以动态地改变他们指向的东西。

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的原始声明,如果类A的每个对象都包含其特定信息,则会更有意义。)

答案 4 :(得分:2)

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

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

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

答案 5 :(得分:1)

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

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