假设我有一个
class A
{
int A1;
void Af();
};然后我就做了:
A hA;
A* pA = new A();现在,hA是堆栈中的一个对象;我可以使用
hA.A1 = 52 // for example但是pA只是指向了class A,这有什么用或方便的?(有什么例子吗?)
第二期:
当我执行A* pA = new A()时,我在堆中分配了什么吗?后台有没有malloc()?若否,原因何在?为什么int *p_array = new int5会在5个int的堆中分配内存,而不是A* pA = new A()?
发布于 2012-03-06 03:51:22
A hA = new A();导致编译器错误。在堆栈上定义变量的正确方法是
A ha;但是pA只指向了A类,这有什么用或有什么用处(请举个例子?)
在内存中的某个位置,你有一个A类型的对象,pa指向它。如果要将该对象的A1成员设置为52,请编写
pA->A1 = 52;为什么是有用的部分并不是一个真正的问题。
当我执行A*
=A()时,我在堆中分配了什么吗?
是的,你做到了。new做两件事:分配内存和调用构造函数。
在后台有没有任何malloc()?
这是未指定的,但在许多实现中,new是通过malloc实现的
为什么int[] A= A42会在42个整数的堆中分配内存,而不是A pA =
A()?
先生,这也是一个编译器错误。你的意思是
int* A = new A[42];这是在堆上分配数组并在必要时调用构造函数的operator new[] (对于整型数组则不是)。
发布于 2012-03-06 04:28:17
当编译时容量或数据量未知时,才会使用指向对象的指针。从用户接收文本就是一个很好的例子。用户是否会输入5个字符,10,1k?
如果我的程序分配1k,而用户从未输入超过32个字符,这是对空间的浪费。
动态内存分配的另一个用途是在对象之间传递信息:
对象1创建一本书,但不负责销毁它。
Object 2校对图书,生成更正列表,但不会销毁图书。
对象3将表添加到书中,但仍然不会销毁它。
对象4保存这本书,然后销毁它。
请阅读"C++常见问题解答“,快速解答常见的C++问题。
发布于 2012-03-06 04:56:22
但是pA只是指向了class A,这有什么用或方便的?(有什么例子吗?)
事实并非如此。pA指向A对象,所以*pA是一个对象,就像hA是一个对象一样:
(*pA).A1 = 52 // for example当您执行A* pA = new A()时,是的,会发生动态分配。不一定是对malloc()的调用,而是某种东西。(忽略用户定义的operator new的使用,它可以做任何你喜欢的事情)
new A()主要做两件事。它在某个地方为对象分配空间。如果成功,那么它将构造一个您在该位置请求的类型的对象。如果对象构造成功,那么它只返回一个指向该对象的指针。
https://stackoverflow.com/questions/9572967
复制相似问题