首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【C++】构造函数分类 ② ( 不同的内存创建的实例对象 | 栈内存创建实例对象 | new 关键字创建对象 )

一、不同的内存创建的实例对象 1、栈内存创建实例对象 在上一篇博客 【C++】构造函数分类 ① ( 构造函数分类简介 | 无参构造函数 | 有参构造函数 | 拷贝构造函数 | 代码示例 - 三种类型构造函数定义与调用...栈内存的 变量 Student s1 ; 这些都是内存 创建 的实例对象 的情况 ; // 调用无参构造函数 Student s1; // 打印 Student s1 实例对象值..., 栈内存只占 4 字节的指针变量大小 ; Student* s2; C++ 语言中 , 可以使用 new 关键字 , 调用有参构造函数 , 创建的 实例对象 ; 在下面的 C++ 代码 ,...声明并定义了 MyClass , 该类定义了一个有参构造函数 , 接受两个整数作为 构造函数参数 ; main 函数 , 使用 使用 new 关键字 来调用 有参构造函数 创建 MyClass...0; } 使用 new 关键字 为 新创建的 实例对象 内存中分配内存 , 该对象使用完毕后 , 要使用 delete 关键字释放 堆内存的空间 , delete obj , 避免出现内存泄漏的情况

15220
您找到你想要的搜索结果了吗?
是的
没有找到

浅拷贝和深拷贝(用string分析)

初始化和赋值的过程,假设涉及到堆内存,如果采用编译器系统默认给定的拷贝构造函数和赋值运算符的重载函数进行对象之间的初始化过程和赋值过程,轻则发生浅拷贝,重则内存泄漏,这样的程序都是有问题的。...下面再讨论一下使用默认赋值运算符重载的拷贝构造函数使用时出现的内存泄漏以及浅拷贝问题。...=(str1)这样的调用方式 } 编译器系统默认的赋值运算符的重载函数是简单的赋值。 解决方案:自己实现赋值运算符重载函数,两个目的:1.避免出现内存泄漏的问题。..._data);//进行内存拷贝 return *this; } //经过上述的处理,内存泄漏和浅拷贝的问题都得以解决 总结:实现构造函数,往往会涉及到堆内存的开辟。...如果对拷贝构造函数和赋值运算符的重载函数不进行重写,会发生浅拷贝以及内存泄漏等问题导致程序出错。

40710

【C++】运算符重载案例 - 字符串 ① ( Visual Studio 创建 String | 构造函数与析构函数 | 完整代码示例 )

一、Visual Studio 创建 String 右键点击 " 解决方案资源管理器 " 的 解决方案 名称 , 弹出菜单 , 选择 " 添加 / " 选项 ; 输入 String 名..., delete 会自动调用析构函数 ; m_p = new char[m_len + 1]; 最后 , 拷贝空字符串到 m_p 指向的内存 ; // 拷贝空字符串到 m_p 指向的内存 strcpy...[m_len + 1]; // 拷贝空字符串到 m_p 指向的内存 strcpy(m_p, ""); cout << "调用无参构造函数" << endl; } 3、有参构造函数 有参构造函数... 拷贝构造函数 , 使用 String 对象初始化 对象值 ; 首先 , 拷贝字符串长度 ; 注意 : 字符串指针 指向的内存空间大小需要 +1 , 内容是 ‘\0’ ; this->m_len...this->m_p = new char[this->m_len + 1]; // 拷贝字符串到 m_p 指向的内存 strcpy(m_p, p); } cout << "调用有参构造函数

20620

创建子类对象时,父构造函数调用被子类重写的方法为什么调用的是子类的方法?

A(); B b = new B(); } } 问题:为什么创建A对象的时候父调用子类方法?...但是:创建B对象父调用的方法? 答案: 当子类被加载到内存方法区后,会继续加载父内存。...如果子类方法没有重写也没有重载父方法,则方法引用会指向父方法。 当子类对象创建时,会先行调用构造方法(构造方法也是方法),虚拟机会在子类方法区寻找该方法并运行。...其结果是当编译的时候,父构造方法调用的方法的参数已经强制转换为符合父方法的参数了。 上边代码在编译前已经转换为下面这个样子的了。...A(); B b = new B(); } } 看一下上边的代码,是不是恍然大悟?

6.1K10

CC++面试常问题集(2)

因此,创建子类对象时,为了初始化从父继承来的数据成员,系统需要调用其父构造方法。 二,析构函数  析构函数也不会被子类继承,只是子类的析构函数中会调用的析构函数。...三,赋值运算符重载函数  赋值运算符重载函数也不会被子类继承,只是子类的赋值运算符重载函数中会调用的赋值运算符重载函数。 7、基的析构函数为什么要用virtual虚析构函数?...C++采用virtual虚析构函数是为了防止内存泄漏 具体地说,如果派生申请了内存空间,并在其析构函数对这些内存空间进行释放。...那么在这种情况下,派生申请的空间就得不到释放从而产生内存泄漏。所以,为了防止这种情况的发生,C++的析构函数应采用virtual虚析构函数。...它们都可用于申请动态内存和释放内存; new/delete会调用对象的构造/析构函数, 而malloc/free只会分配/释放内存; malloc与free是C++/C语言的标准库函数new/delete

1.1K10

C++进阶之路:何为拷贝构造函数,深入理解浅拷贝与深拷贝(与对象_中篇)

MyClass 拥有一个指针 data,默认构造函数为其分配内存,并在析构函数释放内存。...拷贝构造函数通过使用 new 运算符堆上分配新的内存,并将原对象的数据复制到新内存。...然而,当一个拥有指针或引用等需要特别注意的成员变量时,编译器生成的默认拷贝构造函数不能保证正确的深拷贝,会导致浅拷贝问题和内存泄漏等问题。...为了实现深拷贝,通常需要手动分配内存并将原始对象的数据复制到新对象,例如使用 new 运算符来动态分配内存,并通过拷贝构造函数或赋值运算符将数据复制到新对象。...否则,执行浅拷贝时,两个对象将共享同一块内存,可能会导致悬挂指针、内存泄漏等问题。

23500

C++面试题

相同点: 对于内部数据类型来说,没有构造与析构的过程,所以两者是等价的,都可以用于申请动态内存和释放内存; 不同点: new/delete可以调用对象的构造函数和析构函数,属于运算符,在编译器权限之内;...内存泄漏的场景: malloc和free未成对出现;new/new []和delete/delete []未成对出现; 创建对象分配内存,但未显式释放内存;比如,通过局部分配的内存,未在调用函数体内释放...,从而造成两次释放相同内存的做法;比如,包含指针成员变量,未定义拷贝构造函数或未重载赋值运算符的情况下,编译器会调用默认的拷贝构造函数或赋值运算符,以逐个成员拷贝的方式来复制指针成员变量,使得两个对象包含指向同一内存空间的指针...,那么释放第一个对象时,析构函数释放该指针指向的内存空间,释放第二个对象时,析构函数就会释放同一内存空间,这样的行为是错误的; 没有将基的析构函数定义为虚函数。...8、如何构造一个,使得只能在堆上或只能在栈上分配内存? 只能在堆上分配内存:将析构函数声明为private; 只能在栈上生成对象:将new和delete重载为private。

99230

C++打怪升级(七)- 动态内存管理

C语言中有关动态内存开辟空间的函数;不过C++中一般不会直接使用原生的C语言中的malloc/calloc/realloc/free函数,C++为了更好地支持面向对象,引入了有关动态内存的新概念:new...; new和delete的真正不同的用处是相对于自定义类型来说的; new 完成内存空间的申请; 调用构造函数进行初始化 class A { public: A(int a = 1) :_...0; } ---- 自定义类型 调用operator new[]函数operator new[]实际调用operator new函数完成N个对 象空间的申请; 申请的空间上执行N次构造函数...0; } 内存泄漏,对象数组起始地址之前还有额外的空间未被释放; 把A的显式析构函数去掉就不报错了: delete不需要调用显式的析构函数申请对象数组时就没有开辟额外的空间记录对象数组的元素个数...申请空间后会调用构造函数完成对象的初始化,delete释放空间前会调用析构函数完成空间中资源的清理 ---- 后记 本节主要介绍了C++的动态内存管理方式:new/delete、new[]/delete

1.2K10

从零开始学C++之对象语义与值语义、资源管理(RAII、资源所有权)、模拟实现auto_ptr、实现Ptr_vector

); 即要拷贝构造一个AddNode 对象,最远也得从调用Node的拷贝构造函数开始(默认拷贝构造函数调用的拷贝构造函数,如果是自己实现的而且没有显式调用,将不会调用的拷贝构造函数),因为私有...容易出现空悬指针、内存泄漏、重复删除等错误。 (二)、RAII 与 auto_ptr 一个对象可以拥有资源。在对象的构造函数执行资源的获取(指针的初始化),析构函数释放(delete 指针)。...(程序编译时使用了这里的内存泄漏跟踪器,现在new 没有匹配delete 但没有输出信息,说明没有发生内存泄漏)。...,再插入容器,在这里再提一点,就是vector 只负责裸指针本身的内存的释放,并不负责指针指向内存的释放,假设一 个MultipleNode 有成员vector vec_; 那么的析构函数需要遍历容器...new 分配指针本身的内存,如果此时内存耗尽,operator new 失败,push_back 抛出异常,此时裸指针既没有被智能指针接管,也 没有插入vector(不能在的析构函数遍历vector

66510

C++:26---动态内存管理new、delete

对象创建的同时要自动执行构造函数,对象消亡之前要自动执行析构函数。...由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。...new和delete是运算符不是函数 因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。...使用规则 ①我们可以使用将shared_ptr对象指向一个new所申请的动态内存new申请的动态内存的使用、释放等规则仍然符合shared_ptr的使用规则 使用语法 因为智能指针的构造函数是...(p)); //正确} 十、new传参时与shared_ptr的关系 当一个函数的参数是shared_ptr时,有以下规则: 函数调用是传值调用 调用函数时,该shared_ptr所指向的对象引用计数加

65020

从零开始学C++之对象语义与值语义、资源管理(RAII、资源所有权)、模拟实现auto_ptr、实现Ptr_vector

即要拷贝构造一个AddNode 对象,最远也得从调用Node的拷贝构造函数开始(默认拷贝构造函数调用的拷贝构造函数,如果是自己实现的而且没有显式调用,将不会调用的拷贝构造函数),因为私有,故不能访问...容易出现空悬指针、内存泄漏、重复删除等错误。 (二)、RAII 与 auto_ptr 一个对象可以拥有资源。在对象的构造函数执行资源的获取(指针的初始化),析构函数释放(delete 指针)。...(程序编译时使用了这里的内存泄漏跟踪器,现在new 没有匹配delete 但没有输出信息,说明没有发生内存泄漏)。...,再插入容器,在这里再提一点,就是vector 只负责裸指针本身的内存的释放,并不负责指针指向内存的释放,假设一 个MultipleNode 有成员vector vec_; 那么的析构函数需要遍历容器... new 分配指针本身的内存,如果此时内存耗尽,operator new 失败,push_back 抛出异常,此时裸指针既没有被智能指针接管,也 没有插入vector(不能在的析构函数遍历vector

1.8K00

【C++】动态内存管理

更多详细有关C语言动态内存管理的知识可以移步:【C语言】内存的动态分配与释放 C++,动态内存的管理是通过一对运算符来完成的: new,动态内存为对象分配空间并返回一个指向该对象的指针...,new不需要,但是new需要捕获异常 申请自定义类型对象时,malloc/free只会开辟空间/释放空间,不会调用构造函数与析构函数,而new申请空间后会调用构造函数完成对象的初始化,delete释放空间前会调用析构函数完成空间中资源的清理...自定义类型 new的原理 调用operator new函数申请空间 申请的空间上执行构造函数,完成对象的构造 delete的原理 空间上执行析构函数,完成对象中资源的清理工作 调用operator...delete函数释放对象的空间 new T[N]的原理 调用operator new[]函数operator new[]实际调用operator new函数完成N个对象空间的申请 申请的空间上执行...N次构造函数 delete[]的原理 释放的对象空间上执行N次析构函数,完成N个对象中资源的清理 调用operator delete[]释放空间,实际operator delete[]调用operator

9610

C++系列 | 每一个C++程序员都应该知道的RAII

: 所有资源构造函数获取,例如:分配内存、打开文件、建立数据库连接等;如果无法完成则在构造函数抛出异常; 所有资源析构函数释放,例如:释放内存、关闭文件、销毁数据库连接等;不应该抛出任何异常...为什么要使用RAII 我们知道,C++,通过new运算符动态申请内存,例如: Foo* ptr = new Foo(1); // ... delete ptr; 在这段代码new运算符计算机内存的堆上申请了一块...为了能够释放内存资源,我们需要使用完new运算符申请的内存后,手动调用delete运算符释放内存。 但是,情况并不总是如此简单。...实现资源管理需要注意的一些事项: 需要仔细考虑拷贝构造函数和拷贝赋值运算符的实现,若需拷贝,应考虑实现引用计数或对资源进行深拷贝;若无必要,最好将其删除。...总结 本文中,我们介绍了C++的RAII技术,它是一种管理资源的方法,可以帮助我们避免内存泄漏和资源泄漏等问题。

59700

剖析【C++】——与对象()——小白篇—超详解

1.的6个默认成员函数C++,即使一个没有定义任何成员或成员函数,编译器仍会为其生成以下6个默认成员函数。下面是对这些默认成员函数的简易分析和代码示例。 1....默认构造函数(Default Constructor) 默认构造函数创建对象时被调用。如果类没有定义任何构造函数,编译器会自动生成一个默认的无参构造函数。...2.构造函数详解 构造函数是C++的一个重要概念,它使对象创建时自动初始化。...C++11引入了定义时为内置类型成员变量提供默认值的功能,从而增强了默认构造函数的实用性。 3.析构函数详解 析构函数是C++的一个重要概念,它使对象销毁时能自动清理资源。...资源管理示例:Stack中有资源需要管理时,例如动态内存,必须显式定义析构函数以防止资源泄漏

8910

C++: 06---构造函数析构函数

思考: 当对象存在指针成员时,为什么需要自己实现拷贝构造函数?如果不,会出现怎样的问题?...(浅拷贝) 默认赋值运算符的重载函数: 赋值运算符重载函数用于对象的赋值操作,当我们未实现该函数时,编译器会自动为我们实现该函数。...同拷贝构造函数一样,系统默认的赋值运算符重载函数是浅拷贝,中含有指针类型的变量,须自定义赋值运算符重载函数用深拷贝来实现。...= &rhs)//判断是否给自己赋值 { delete[] mname;//防止内存泄漏 mname = new char[strlen(rhs.mname) + 1](); strcpy...String声明的函数: 1、构造函数 /*    1、构造函数构造对象时使用;   2、传入参数的判断;   3、对象的初始化问题。

65520

【CC++】——小白初步了解——内存管理

C++动态内存管理 C++,动态内存管理不仅可以使用C语言的函数(如malloc、calloc等),还提供了更高级的 new 和 delete 运算符: 1.new: 功能:分配指定类型的内存,并调用该类型的构造函数...它们类似于 malloc 和 free,但有一些重要区别: operator new: 功能:分配指定大小的内存,但不调用构造函数。 通常在new运算符隐式调用。...通常在的delete运算符隐式调用。 可以重载这两个函数以定制内存分配行为。...定位new表达式(placement-new) placement new 是C++的一个高级特性,用于已分配的内存构造对象。它不会分配新的内存,只是调用对象的构造函数。...用于分配对象。 malloc: 仅分配内存,不调用构造函数。 返回 void* 类型的指针,需要类型转换。 不能重载。 用于分配任意类型的内存。 2.什么是内存泄漏?如何避免?

9510

从零开始学C++之对象语义与值语义、资源管理(RAII、资源所有权)

即要拷贝构造一个AddNode 对象,最远也得从调用Node的拷贝构造函数开始(默认拷贝构造函数调用的拷贝构造函数,如果是自己实现的而且没有显式调用,将不会调用的拷贝构造函数),因为私有,故不能访问...容易出现空悬指针、内存泄漏、重复删除等错误。 (二)、RAII 与 auto_ptr 一个对象可以拥有资源。在对象的构造函数执行资源的获取(指针的初始化),析构函数释放(delete 指针)。...(程序编译时使用了这里的内存泄漏跟踪器,现在new 没有匹配delete 但没有输出信息,说明没有发生内存泄漏)。...,再插入容器,在这里再提一点,就是vector 只负责裸指针本身的内存的释放,并不负责指针指向内存的释放,假设一 个MultipleNode 有成员vector vec_; 那么的析构函数需要遍历容器...new 分配指针本身的内存,如果此时内存耗尽,operator new 失败,push_back 抛出异常,此时裸指针既没有被智能指针接管,也 没有插入vector(不能在的析构函数遍历vector

1K20

看完这篇你还能不懂C语言C++内存管理?

placement new不用担心内存分配失败,因为它根本不分配内存,它做的唯一一件事情就是调用对象的构造函数。...} 注意:使用该运算符构造的对象或数组,一定要显式调用析构函数,不可用 delete 代替析构,因为 placement new 的对象的大小不再与原空间相同。...cont<<"~A()构造函数调用"<<endl; } } main 主函数,加入如下代码: A* pa = new A(); // A 的构造函数调用 delete pa;...// A 的析构函数调用 可以看出:使用 new 生成一个对象时系统会调用该类的构造函数,使用 delete 删除一个对象时,系统会调用该类的析构函数。...如果你的使用了操作系统资源,单纯把的对象从内存删除是不妥当的,因为没有调用对象的析构函数会导致系统资源不被释放,这些资源的释放必须依靠这些的析构函数

61620
领券