| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 375 人关注过本帖
标题:请大婶帮忙,如何解决析构函数时指针悬挂问题?
只看楼主 加入收藏
Dua瀚狼
Rank: 2
来 自:湖南长沙
等 级:论坛游民
帖 子:59
专家分:78
注 册:2012-3-11
结帖率:90.91%
收藏
已结贴  问题点数:20 回复次数:4 
请大婶帮忙,如何解决析构函数时指针悬挂问题?
#include<iostream>
#include<cstdlib>

using namespace std;

//int i = 1;

int cmp(const void *p, const void * q) {
    return *(int *) p - *(int *) q;
}

class Set{
        int *elem;                   //存放集合元素的指针
        int count;                   //存放集合中的元素个数
    public:
        Set();
        Set(int s[],int n);
        ~Set() {
            cout << "XiGou" << endl;
            //cout << "析构" << i++ << "次" << endl;
        }
        int find(int x) const;       //判断x是否在集合中
        Set operator+(const Set &);  //集合的并集
        //Set operator-(const Set &);  //集合的差集
        //Set operator*(const Set &);  //集合的交集
        void disp();                 //输出集合元素
};

Set::Set() { };

Set::Set(int s[], int n) : elem(s), count(n) { } ;

int Set::find(int x) const {
    for(int i = 0; i < count; ++i){
        if(x == elem[i]){
            return 1;
        }
    }
    return 0;
}

void Set::disp() {
    //cout << "The length of the ";
    cout << "该集合的元素个数为:\t";
    cout << count << endl;
    cout << "其元素如下:";
    qsort(elem, count, sizeof(int), cmp);
    for(int j = 0; j < count; j++)
    {
        cout << elem[j] << "  ";
    }
    cout << endl;
}

Set Set::operator + (const Set &A) {
    Set temp;
    temp = * this;
    int i, l;
    for(i = 0; i < A.count; ++i) {
        l = find(A.elem[i]);
        if(!l) {
            temp.count++;
            temp.elem[temp.count - 1] = A.elem[i];
        }
    }
    return temp;
};

int main(){
    Set A;
    int b[] = {1, 3, 5, 6, 7}, b2[] = {2, 3, 6, 8, 7, 9};
    Set a(b, 5), a2(b2, 6);
    Set c;
    c = a + a2;
    c.disp();
    return 0;
}
写了个集合的并集,可是用到析构函数时总会出错(指针悬挂),求大神帮忙! 如果我把析构函数注释掉,就可以,这又是什么情况,系统不是有默认析构函数吗,它不也一样执行析构函数?求解惑!谢谢!
搜索更多相关主题的帖子: public include void return 
2012-12-03 23:19
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:10 
Set Set::operator + (const Set &A) {
     Set temp;
     temp = * this;
     int i, l;
     for(i = 0; i < A.count; ++i) {
         l = find(A.elem[i]);
         if(!l) {
             temp.count++;
             temp.elem[temp.count - 1] = A.elem[i];
         }
     }
     return temp;
 };

这个地方已经把堆栈破坏了,这样写是不行的,因为temp.elem[temp.count - 1] 这个不是你的空间,非法内存。
申请另外一个内存来存放吧

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2012-12-03 23:54
Dua瀚狼
Rank: 2
来 自:湖南长沙
等 级:论坛游民
帖 子:59
专家分:78
注 册:2012-3-11
收藏
得分:0 
回复 2楼 yuccn
我不是已经把temp这个地址指向*this 吗,比如说定义一个 "Set A( , )"那不就是指向了A说在的地址?还有请问一下为什么我把析构函数注释掉就正确呢?

我怀旧,因为我看不到未来。
2012-12-04 00:10
Dua瀚狼
Rank: 2
来 自:湖南长沙
等 级:论坛游民
帖 子:59
专家分:78
注 册:2012-3-11
收藏
得分:0 
别沉啊。。。。

我怀旧,因为我看不到未来。
2012-12-04 22:53
wuxia111111
Rank: 2
等 级:论坛游民
帖 子:32
专家分:60
注 册:2012-11-18
收藏
得分:10 
#include<cstdlib>

using namespace std;

//int i = 1;

int cmp(const void *p, const void * q) {
    return *(int *) p - *(int *) q;
}

class Set{
        int *elem;                   //存放集合元素的指针
        int count;                   //存放集合中的元素个数
    public:
        Set();
        Set(int s[],int n);
        ~Set() {
            cout << "XiGou" << endl;
            //cout << "析构" << i++ << "次" << endl;
        }
        int find(int x) const;       //判断x是否在集合中
        Set operator+(const Set &);  //集合的并集
        //Set operator-(const Set &);  //集合的差集
        //Set operator*(const Set &);  //集合的交集
        void disp();                 //输出集合元素
};

Set::Set() { }

Set::Set(int s[], int n) : elem(s), count(n) { } //直接将数组地址传过来了,此为静态的分配内存;动态分配内存,才考虑指针悬挂啊!你的结果好几个是因为创建了好几个对象,调用了好几次析构函数。且花括号后面不需要“;”啊!
int Set::find(int x) const {
    for(int i = 0; i < count; ++i){
        if(x == elem[i]){
            return 1;
        }
    }
    return 0;
}

void Set::disp() {
    //cout << "The length of the ";
    cout << "该集合的元素个数为:\t";
    cout << count << endl;
    cout << "其元素如下:";
    qsort(elem, count, sizeof(int), cmp);
    for(int j = 0; j < count; j++)
    {
        cout << elem[j] << "  ";
    }
    cout << endl;
}

Set Set::operator + (const Set &A) {
    Set temp;
    temp = * this;
    int i, l;
    for(i = 0; i < A.count; ++i) {
        l = find(A.elem[i]);
        if(!l) {
            temp.count++;
            temp.elem[temp.count - 1] = A.elem[i];
        }
    }
    return temp;
};

int main(){
    Set A;
    int b[] = {1, 3, 5, 6, 7}, b2[] = {2, 3, 6, 8, 7, 9};
    Set a(b, 5), a2(b2, 6);
    Set c;
    c = a + a2;
    c.disp();
    return 0;
}
2012-12-04 23:19
快速回复:请大婶帮忙,如何解决析构函数时指针悬挂问题?
数据加载中...
 
   



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

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