查看: 3265| 回复: 12
跳转到指定楼层
上一主题 下一主题
收起左侧

Ananimous(1) C++找bug

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
class CArray
{
public:
        CArray() { pArr = NULL; nNum = 0; }
        ~CArray() { delete []pArr; }

        void Print()
        {
                if (nNum <= 0 || pArr == NULL) return;
                for (int i = 0; i < nNum; i++)
                        cout<<pArr<<" ";
                cout<<endl;
        }

        CArray& operator = (const CArray& arr)
        {
                if(arr.nNum <= 0) return *this;
               
                delete []pArr;
                pArr = new int[arr.nNum];
                nNum = arr.nNum;

                for (int i = 0; i < nNum; i++)
                        pArr[i] = arr.pArr[i];
                return *this;
        }

        void Init(int n, int* a = NULL)
        {
                assert(n>0);

                delete[] pArr;
                pArr = new int[n];
                nNum = n;
                memset(pArr, 0, sizeof(nNum*sizeof(int)));

                if (a != NULL)
                {
                        for (int i = 0; i < n; i++)
                                pArr[i] = a[i];
                }
        }

private:
        int* pArr;
        int  nNum;
};

void main()
{
    ...XX....
    ...OO....

    CArray arr2 = arr1;
    arr2.Print();

    ...XXOO.....
}

前段时间发现的一个bug,自己的疏忽。
类写的有一处可能引起使用时程序的崩溃,请指出。
[/i][/i][/i][/i]

上一篇:Microsoft(1) Recerse linked list by block
下一篇:Ananimous(2) 找出得分最高的无重复子段
🔗
Saber 2011-4-18 18:50:37 | 只看该作者
全局:
本帖最后由 Saber 于 2011-4-18 18:52 编辑

       CArray operator = (const CArray& arr)
        {
                if(arr.nNum <= 0) return *this;  //为0的时候也应该做的?
               
                delete []pArr;
                pArr = new int[arr.nNum];
                nNum = arr.nNum;

                for (int i = 0; i < nNum; i++)
                        pArr = arr.pArr;    //
[i]P.S. 论坛自动把【i】去掉了?[/i]
[i]

                return *this;
        }


[/i]
回复

使用道具 举报

🔗
 楼主| wwwyhx 2011-4-19 09:20:33 | 只看该作者
全局:
没人会吗????
回复

使用道具 举报

🔗
vvnesaa 2011-4-19 10:07:50 | 只看该作者
全局:
No checking for assignment to self
回复

使用道具 举报

🔗
vvnesaa 2011-4-19 10:21:24 | 只看该作者
全局:
And this
CArray arr2 = arr1
calls copy ctor not operator=

评分

参与人数 1大米 +23 收起 理由
wwwyhx + 23

查看全部评分

回复

使用道具 举报

🔗
 楼主| wwwyhx 2011-4-19 11:05:06 | 只看该作者
全局:
And this
CArray arr2 = arr1
calls copy ctor not operator=
vvnesaa 发表于 2011-4-19 10:21



    Absolutely right!!
回复

使用道具 举报

🔗
danielgao 2011-4-19 12:04:35 | 只看该作者
全局:
其实我想问,这个类如果我在主程序里定义了个instance,但是没有做任何操作,程序运行完成后自动释放内存的时候是不是会挂掉? destructor里面的delete 似乎会尝试去释放NULL。。。
回复

使用道具 举报

🔗
 楼主| wwwyhx 2011-4-19 12:36:44 | 只看该作者
全局:
其实我想问,这个类如果我在主程序里定义了个instance,但是没有做任何操作,程序运行完成后自动释放内存的 ...
danielgao 发表于 2011-4-19 12:04


delete NULL 不会出错
回复

使用道具 举报

全局:
回复 6# wwwyhx

能讲一下为什么会出错?还有怎样写才对啊?
回复

使用道具 举报

🔗
Etrnls 2011-5-6 13:42:09 | 只看该作者
全局:
回复 9# kidd_yq@163.com

当你的类里面有指针的时候,通常你不希望多个实例里面的指针指向同一个东西,不仅仅因为修改一个实例会影响到其他实例,还因为一个实例被销毁的时候会导致其他实例里面的指针变成dangling pointer

所以
当你的类里面有指针的时候,至少需要写这些东西:
析构函数,用来delete指针
复制构造函数,用来在复制的时候new一个新指针然后把指针指向的东西copy过来
operator=,同上,通常operator=和复制构造函数写一个另一个一定要写的,否则这个类的行为会不consistent。同时灰常重要的,operator=一定要有self assignment检查,否则很可能在碰到a = a这种赋值的时候挂掉。

评分

参与人数 1大米 +100 收起 理由
wwwyhx + 100

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表