| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 715 人关注过本帖, 1 人收藏
标题:关于析构函数
取消只看楼主 加入收藏
humy
Rank: 2
等 级:论坛游民
帖 子:69
专家分:18
注 册:2012-7-23
结帖率:92.86%
收藏(1)
已结贴  问题点数:20 回复次数:4 
关于析构函数
书中说:
1“当对象的引用或指针超出作用于时不会运行析构函数,只有删除指向动态内存分配对象的指针或实际对象而非对象的引用超出作用域时才会运行析构函数。 ”我写了下面的例子,是这个意思吗?

{
   int a;
   int* p =&a;
   int &b=a;
   int* c=new int;
}//这里会运行析构函数删除a,c,但不会有析构函数运行删除p,b



   
2" 撤销一个容器,布伦内置数组还是标准库容器,会运行析构函数:
{
  sales_item*p=new sales_item【10】;//我想问这是不是错了不应该sales_item**p吗?
  vector<sales_item> vec(p,p+10);
//...
delete []p;
}
"
按上面的文字,他就会运行析构函数删除数组和容器啊,为什么还要写delete []p;?
搜索更多相关主题的帖子: 动态 
2012-08-23 11:38
humy
Rank: 2
等 级:论坛游民
帖 子:69
专家分:18
注 册:2012-7-23
收藏
得分:0 
回复 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出来的空间。
对不?
2012-08-25 16:52
humy
Rank: 2
等 级:论坛游民
帖 子:69
专家分:18
注 册:2012-7-23
收藏
得分:0 
回复 6楼 pangding
4小时前?   版主睡的太晚了吧。。。不能太辛苦了,身体是革命的本钱哦!
2012-08-27 08:34
humy
Rank: 2
等 级:论坛游民
帖 子:69
专家分:18
注 册:2012-7-23
收藏
得分:0 
回复 6楼 pangding
程序代码:
#include<iostream>
using namespace std;
class A {
public:
    A() { cout << "A()" << endl; }
    ~A() { cout << "~A()" << endl; }
    
};


int main(){
     A a;
    A & p=a;
    A* m=&a;
    cout<<"sizeof(a)"<<sizeof(a)<<"sizeof(p)"<<sizeof(p)<<endl;
    //cout<<"delete m"<<endl;
//    delete m;
//    cout<<"delete p"<<endl;
//    delete p;

    cout<<"main ends"<<endl;
    return 0;
    
}


1.上面例子不管是delete a,p,m都会出错。。。“指针是内置类型,和 int 之类的东西一样,一般不需要析构,但也不是不能析构。”上面出现error的例子是吗?只是不成立的例子而已。。。总结:他们及内置类型没有其他方法,只能等运行到超出作用域,机器自动删除它对吧?

2.输出
A()
sizeof(a)1sizeof(p)1
main ends
~A()
请按任意键继续. . .
p,a的大小一样。。。那这怎么办的?p的空间里放的的什么?引用可不是复制a的内容到p啊?“又想了一下,是不是p本身就没有占用内存?他只是a的别名。?所以没析构函数的事?
指针本身也是要占内存的,”。。。p不是引用吗?怎么又是指针呢?
3.
图片附件: 游客没有浏览图片的权限,请 登录注册
图片附件: 游客没有浏览图片的权限,请 登录注册
图片附件: 游客没有浏览图片的权限,请 登录注册
图片附件: 游客没有浏览图片的权限,请 登录注册
错了哎?。。。。。
谢谢
2012-08-27 10:12
humy
Rank: 2
等 级:论坛游民
帖 子:69
专家分:18
注 册:2012-7-23
收藏
得分:0 
回复 9楼 pangding
3.是:
int a = 5;
int b[5];
int *p = &a;
int *q = &b;

版主有举这个例子
试了,错了。。。
又改为int**q=&b;
int*[5]q=&b;
等一系列见截图,都是错的。。。
2012-08-27 22:51
快速回复:关于析构函数
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020872 second(s), 11 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved