回复 3楼 pangding
1.A & 和A *都不是A,即p,qa都不是A类的对象,即使会运用析构函数也不会用A定义的析构函数啊?
2.这个例子是不是说p,qa,虽然超过作用于不能再被引用,但是他们的空间没被释放?还是说他们的空间也被释放了,只是用的不是析构函数。。。?还是qa这个指针所占内存被释放了,但他所指向的A类对象的内存没释放?
3.又想了一下,是不是p本身就没有占用内存?他只是a的别名。?所以没析构函数的事?
4.而对于指针,:“对象的引用或指针”和“删除指向动态内存分配对象的指针”中的指针一样吗?如果指针不一样,是取决于他指向的对象的内存的分配方式?比如A* m,n;
A a;
m=&a;
n=new A();则m,n类型不一样,n就是所说的
指向动态内存分配对象的指针 (就是涉及new,delete的) ?
“当对象的引用或指针超出作用于时不会运行析构函数,只有删除指向动态内存分配对象的指针或实际对象而非对象的引用超出作用域时才会运行析构函数。 ”这句话前后的解释是m,n?
于是我把delete pa注释掉,在inner里加了delete qa;
输出
main begins
outer begins
A()
inner begins
A()
~A()
inner ends
~A()
outer ends
main returns
请按任意键继续. . .
所以我又想指针没有不同,要且仅有用了delete就会运行析构。。。
不知我的哪个想法是对的?
5.int *p=new int[10];用这个是了一下,成功了。int **p=new int[10];这个就出错了。。我又找了书,在操作符里,new和new【】是分别的两个操作符。。。那他这个p是不是不指数组,只是指int元素?。。。而int **p=new (int*)[10];或(int *)*p=new (int*)[10];也会有一大堆错。。。。
6.改了一下,把他们放在inner里看是不是只要数组,容器使命结束它就会自动运行析构。。好像是的,结果:
A()
A()
A()
A()
A()
=== ^_^ ===
A()
A(A&)
~A()
A()
A(A&)
~A()
A()
A(A&)
~A()
A()
A(A&)
~A()
A()
A(A&)
~A()
inner ends
~A()
~A()
~A()
~A()
~A()
~A()
~A()
~A()
~A()
~A()
main returns
请按任意键继续. . .
结合版主所说“你自己申请的这 10 个还是得你自己释放。”
我觉得我的这个观点对:
动态分配就是用new什么的,指向他的地址指针什么的不涉及A的析构,这个指针会自己释放的,析构是指释放这些new出来的空间。
对不?