先来一段会出错的代码:
#pragma once #include <iostream> class StringBad { public: StringBad(const char *s); StringBad(); ~StringBad(); //friend friend std::ostream &operator <<(std::ostream &os, const StringBad &st); private: char *str; int len; static int num_strings; };
#include "StdAfx.h" #include "StringBad.h" int StringBad::num_strings = 0; StringBad::StringBad( const char *s ) { len = std::strlen(s); str = new char[len + 1]; std::strcpy(str, s); num_strings++; std::cout << num_strings << ": \"" << str << "\"object created \n"; } StringBad::StringBad() { len = std::strlen("hello world"); str = new char[len + 1]; std::strcpy(str, "hello world"); num_strings++; std::cout << num_strings << ": \"" << str << "\"object created \n"; } StringBad::~StringBad() { std::cout << "\"" << str << "\" object delete, "; --num_strings; std::cout << num_strings << " left\n"; delete []str; } std::ostream & operator<<( std::ostream &os, const StringBad &st ) { os << st.str; return os; }
// TestObjectThink.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <iostream> #include "StringBad.h" using std::cout; using std::endl; void callMe1(StringBad &rsb) { cout << "reference" << endl; cout << "\"" << rsb << "\"" << endl; } void callMe2(StringBad rsb) { cout << "value" << endl; cout << "\"" << rsb << "\"" << endl; } int _tmain(int argc, _TCHAR* argv[]) { { cout << "Starting an inner block \n"; StringBad hello01("hello_01"); StringBad hello02("hello_02"); StringBad hello03("hello_03"); cout << "hello01: " << hello01 << endl; cout << "hello02: " << hello02 << endl; cout << "hello03: " << hello03 << endl; callMe1(hello01); cout << "hello01: " << hello01 << endl; callMe2(hello02); cout << "hello02: " << hello02 << endl; //等效于StringBad hello01Temp = StringBad(hello01); //新建一个对象并将其初始化为同类现有对象时,会调用复制构造函数。 StringBad hello01Temp = hello01; cout << "hello01Temp:" << hello01Temp << endl; StringBad hello03Temp; hello03Temp = hello03; cout << "hello03Temp:" << hello03Temp << endl; //system("pause"); } return 0; }
callMe2()调用完数据出错了,最后在对象释放时出现了崩溃性的错误,解决方法,加入下面两个函数。
StringBad::StringBad( const StringBad &st ) { num_strings++; len = st.len; str = new char[len + 1]; std::strcpy(str, st.str); std::cout << num_strings << ": \"" << str << "\"object created(copy) \n"; } StringBad & StringBad::operator=( const StringBad &st ) { if (this == &st) { return *this; } delete []str; len = st.len; str = new char[len + 1]; std::strcpy(str, st.str); std::cout << num_strings << ": \"" << str << "\"(assign) \n"; return *this; }
有空了再加上原因, 想急切了解的,参考:C++ primer plus(第六版) P425
相关推荐
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
计算机技术是指评价计算机系统的各种知识和技能的总称。它涵盖了计算机硬件、软件、网络和信息安全等方面。计算机技术的发展使我们能够进行高效的数据处理、信息存储和传输。现代计算机技术包括操作系统、数据库管理、编程语言、算法设计等。同时,人工智能、云计算和大数据等新兴技术也在不断推动计算机技术的进步。计算机技术的应用广泛,涵盖了各个领域,如商业、医疗、教育和娱乐等。随着计算机技术的不断革新,我们可以更加高效地实现预期自动化、标准化
### 内容概要: 《NTsky新闻发布v1.0测试版》是一款基于 Java 开发的新闻发布系统的测试版本,旨在为新闻机构和媒体提供一个简单易用的新闻发布平台。该系统具有基本的新闻发布和管理功能,包括新闻分类、新闻编辑、新闻发布等核心功能。此外,该版本还提供了 JavaBean,使开发人员能够方便地将系统集成到自己的项目中,快速实现新闻发布的功能。 ### 适用人群: 本测试版本适用于新闻机构、媒体从业者以及Java开发人员。如果你是一家新闻机构或媒体,希望拥有一个简单易用的新闻发布平台,方便快捷地发布和管理新闻,那么这个测试版本将为你提供一个初步的体验。同时,如果你是一名Java开发人员,希望学习和掌握新闻发布系统的开发技术,并且对新闻行业有一定的了解,那么通过这个测试版本,你可以获取到一些JavaBean,并且可以参考系统的设计和实现,为你的项目开发提供参考和借鉴。无论是从业务需求还是技术学习的角度,该测试版本都将为你提供一定的帮助和支持。
javascript,JavaScript 最初由 Netscape 公司的 Brendan Eich 在 1995 年开发,用于 Netscape Navigator 浏览器。随着时间的推移,JavaScript 成为了网页开发中不可或缺的一部分,并且其应用范围已经远远超出了浏览器,成为了全栈开发的重要工具。
15-21.php
汽车租赁系统后端采用了spring,spring mvc,mybatis框架,前端使用了layui,界面美观。 包含功能:客户管理,车辆管理,出租,出租单管理,汽车入库,检查单管理,菜单管理,用户管理,角色管理,日志管理,统计分析等。 该毕业设计功能涵盖了大部分汽车租赁中的业务需求,特点是业务功能较多,有助于学生加深业务到技术的理解。
设计模式_行为型_访问者模式
HTML25-创意网站产品主页模板官网落地页APP主页产品宣传页源码 landing静态页面
快手弹幕采集学习源码
自定义监控项 Windows 二进制文件
数据可视化大屏展示系统HTML模板源码 大数据大屏展示源码 VUE
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
这个项目是用于个人参加浙江大学移动创新竞赛而使用。
2023年全国职业院校技能大赛“区块链技术应用赛项”国赛正式赛题 高职 全国职业院校技能大赛 正式赛题
基于stm32的智能家居系统 基于stm32的智能家居系统
21九章空间解析几何.pdf
吴恩达机器学习python版本代码(完结)
HTML21-印刷模板官网落地页APP主页产品宣传页源码 landing静态页面
### 内容概要: 《[信息办公]简易Java开源订销管理系统》是一款基于 Java 开发的开源项目,旨在为企业和机构提供一套简单易用的订购和销售管理解决方案。该系统具有简洁的界面设计和丰富的功能模块,包括客户管理、产品管理、订单管理、库存管理等核心功能,同时支持生成报表和统计分析,帮助用户快速了解企业的订购和销售情况,提高管理效率和业务决策能力。 ### 适用人群: 本项目适用于企业信息办公人员和Java开发人员。如果你是一位信息办公人员,希望通过一个简单易用的系统来管理企业的订购和销售业务,该系统将为你提供一个方便快捷的解决方案。同时,如果你是一名Java开发人员,希望学习和掌握Java开发技术,并且对企业信息管理系统感兴趣,那么这个开源项目将为你提供一个学习和实践的机会。无论是从业务管理还是技术学习的角度,该项目都将为你提供实用的功能和丰富的学习资源。
[精品] todo_appAdobeXD源码下载设计素材UI设计