C++类中指针初始化注意问题

C++类中指针初始化注意问题

首先了解一下编译器自动生成的赋值函数和operator =函数, 如果你成员变量没有指针那么没什么问题,自带的copy函数会逐bits 的copy,但是如果你类中定义了指针那么问题大了,他会很傻傻的把参数的指针的地址赋值给你的指针,那么你现在类的指针和传入的类的指针指向同一片内存空间,如果那个类释放掉了,那么你的指针指向的就是一片空的内存空间,那么显而易见会出现未知错误。再者当这两个类都析构的时候,那么同一片内存空间就会释放掉两次,这又会出现内存错误。

所以: 我的理解是你要写,要自己重写。认真的把自己指针用new分配内存,然后把别人的指针所有内容赋值过来,不要偷懒。 还有凡是new出来的内存空间存在于堆里,请在析构函数中把他delete掉,不然会内存泄露.

错误例子:

#include <iostream>
#include <string>
#include <cstring>
using namespace std;

class Cow 
{
    private:
        char name[20];
        char *hobby;
        double weight;
    public:
        Cow();
        Cow(const char *nm, const char * ho, double wt);
        //Cow(const Cow &c);

     //   Cow operator=(const Cow &c);
        Cow operator+(Cow &b);
        void ShowCow();
       ~Cow();
};

Cow::Cow()
{
    name[0] = '\0';
    hobby = NULL;
    weight = 0.0;
}

Cow::Cow(const char *nm, const char * ho, double wt) 
{
    strcpy(name, nm);
    hobby = new char[strlen(ho)+1]; 
    strcpy(hobby, ho);
    weight = wt; 
}


Cow Cow:: operator+( Cow &b)
{
    weight = weight + b.weight;
    return *this;
}

Cow::~Cow()
{
    cout<<hobby<<" was delete\n";
//    delete[] hobby;                      //如果这里起用delete,程序编译通过,运行时会出错,如图所示。
}

void Cow::ShowCow()
{
    cout<<"----------------------"<<endl;
    cout<<name<<endl;
    cout<<hobby<<endl;
    cout<<weight<<endl;

}

int main()
{
    Cow a("abc", "ett", 20.0);
    a.ShowCow();

    Cow b("etw","iop", 30.0);
    b.ShowCow();

   Cow c = a+b;
  //  cout<<a+b;
   c.ShowCow();

    return 0;
}

错误分析:
第一个 就是没有写copy函数和operator=函数,导致操作不明确不清晰。
第二个 并没有返回一个&引用类型,而是pass-by-value这种值传递,那么c=a+b的时候 编译器会创建临时变量,然后再通过这个临时变量赋值给c,(由于使用的是编译器自动生成的赋值函数,那么指针只是简单的地址赋值,那么就是说临时变量的指针和c的指针指向同一片区域),当赋值结束的时候,临时变量被释放,指针delete了,这时候c.show()访问了空的内存空间,所以报错误。
第三个 应该自己写copy和copy=函数,然后实现指针new空间,复制内容的过程。
第四个 new的空间在堆中,不能自己去释放掉他,需要delete掉
第五个 如果类继承自父类,那么赋值也要考虑父类部分的赋值,copy函数规范 copy调用copy operator=调用operator=函数。 并且需要判断自己赋值自己的可能,因为父类的指针可以指向子类,这些请看其他专题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值