有指针成员变量,要注意莫要MLK了

Class myString

{

 public:

            myString(const char *value);

            ~myString();

private:

            char *data;

} ;

最简单的类myString,但是值得注意的是它里面有个指针成员char * data。

先来写清楚这个构造函数——

myString::myString(const char *value)

{

        if (value)

        {

                data = new[strlen(data)+1];

                strcpy(data, value);

        }

        else

        {

                data = new[1];

                data[0] = '/0';

        }

}

myString::~myString()

{

        delete [] data;

}

 

好,实例化myString,

myString a("phoebe");  // a.data = "phoebe/0"

myString b("bear");      // b.data = "bear/0"

此时,如果有代码,

a = b;

那么会怎么样呢?

因为myString类没有拷贝构造函数,也没有赋值函数,所以编译器默认的操作是执行“位拷贝”,位拷贝的结果是:

a = b; 等价于 a.data = b.data;

这会造成几种错误:

(1) a从前那块内存没有人去管了,MLK error here!

(2) 如果程序中销毁a和b实例,那么b.data这块内存被double delete了!

(3) 如果a和b的生存空间不同,那么销毁a和b其中的一个,将导致b.data的空间被释放,另一个指针还依然指向这块儿内存呢!

 

因此,得出结论:只要类里面有指针,为避免此类MLK,就需要自己给它写个拷贝构造函数和赋值函数!

ok,来写下myString的拷贝构造函数——

非常简单,其实无非就是从新开辟了块内存,来避免多对象的成员指针指向同一块内存的问题。

myString::myString(const myString & thatString)

{

        data = new char[strlen(thatString.data)+1];

        strcpy(data, thatString.data);

}

这个是赋值函数——

相比较拷贝构造函数,想想便知道,赋值嘛,如果让自己赋给自己,那就不用赋了,除此之外,还要考虑以前的对象已经初始化过的情况,所以要先把以前的灭掉,再给它新生。

myString & myString::operator = (const myString & that)

{

        if (this == &that)

                return this;

        

        delete [] data;

 

        data = new char[strlen(that.data) + 1];

        strcpy(data, that.data);

 

        return *this;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,我们无法找到关于"MLK-FMC-SSDNVME"的具体信息。请核实提供的信息是否正确,并提供更多相关的背景信息,以便我们更好地回答您的问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [MLK-1Q-P常规型三相无线电量采集模块说明书V1.0.pdf](https://download.csdn.net/download/khou18503013185/12193387)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [MLK-1Q-4G智能配变综合监测终端说明书V1.0.pdf](https://download.csdn.net/download/khou18503013185/12193377)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [MLK-IDC-1U机房集中监控智能采集终端说明书.docx](https://download.csdn.net/download/szmaiink/11846476)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值