我有点好奇为什么在创建指针类型对象时内存没有分配给类或结构?
例如: -
class A
{
public:
void show()
{
cout<<" show function "<<endl;
}
};
int main()
{
A *a;
a->show();
return 0;
};
答案 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认为它足够长的时间来确定不这样做的明确理由,我会感到有些惊讶。
有几种不同的方式来看待它:
A
类型的对象,因此您没有获得一个。{li>这就是C和C ++的工作原理。new
对于类类型来说是一个合理的默认值,但如果char *c;
调用new char
(因为行为与C不同,那么它可能会非常混乱)或者char *c;
根本没有分配内存(因为行为与char *A;
不同。new
,则有人必须致电delete
。如果每个delete
对应一个new
,而不是每个delete
对应new
或者定义一个含有隐式的指针,那么保持一致就容易得多内存分配。答案 5 :(得分:1)
您只需创建指针* a,但不为其分配内存。
你应该使用A * a = new A();