![](/img/trans.png)
[英]Why class member function destroies the memory allocated for a pointer argument?
[英]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
的原始声明,如果A
类A
每个对象都包含其特定信息,则更有意义。)
A *a;
可能没有一个单一的原因A *a;
不要分配A
的实例。 这与C ++的设计方式不一致。 如果Stroustrup认为它足够长的时间来确定不这样做的明确理由,我会感到有些惊讶。
几种不同的方式来看待它:
A
型物体,所以你没有得到它。 这就是C和C ++的工作方式。 new
对于类类型来说是一个合理的默认值,但是如果char *c;
它可能会非常混乱char *c;
调用new char
(因为行为与C不同)或char *c;
根本没有分配内存(因为行为与char *A;
不同char *A;
new
则有人将不得不调用delete
。 如果每个delete
对应一个new
,而不是每个delete
对应于new
或定义具有隐式内存分配的指针,则更容易保持直接。 您只需创建指针* a,但不为其分配内存。
你应该使用A * a = new A();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.