百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

C++知识点 23:new 和 delete(c++中new和delete的用法)

ztj100 2025-03-14 22:38 50 浏览 0 评论

23.1 C 和 C++ 创建类的过程
创建一个 C++对象,需要做 2 件事:
1、给对象分配内存
2、调用构造函数来初始化对象(这步必须有,使用未初始化的对象是程序出错的一个重要原因)

---------------------------------------------------------------------------------------------------------------------------------
---
用 C 语言的思想创建对象
// 准备工作:先有个类
class Person
{
public:
void Init() // 成员函数用来初始化对象
{
mAge = 20;
pName = (char*)malloc(strlen("john")+1);
strcpy(pName, "john");
}
void Clean() // 释放堆区属性
{
if (pName != NULL) {
free(pName);
}
}
public:
int mAge;
char* pName;
};

// 创建 Person 类的对象
int main()
{
Person* person = (Person*)malloc(sizeof(Person)); // 给对象 person 分配内存
if(person == NULL)
{
return 0; // 检测分配内存是否成功
}
// 调用初始化函数( C 语言的方式中没有构造函数,要自己写),对 person 初始化
person->Init();
// 清理对象 ( C 语言的方式中没有析构函数,要自己写)
person->Clean();
// 释放 person 对象
free(person);
return EXIT_SUCCESS;
}

---------------------------------------------------------------------------------------------------

用 C 语言创建时候需要注意的点:
1、给对象分配内存:需要计算对象的长度,需要做指针的强制类型转换
2、要检测分配内存是否成功:申请可能失败
3、用户忘记调用初始化函数,释放会报错
4、手动释放对象时候也可能出错,不手动释放还会造成内存泄露

---------------------------------------------------------------------------------------------------

C++中解决动态内存分配的方案:
把创建一个对象所需要的操作都结合在一个称为 new 的运算符里。
当用 new 创建一个对象时,它就在堆里为对象分配内存、调用构造函数完成初始化。
delete 表达式与 new 相反。 delete 表达式先调用析构函数,然后释放内存。
注意:
1、正如 new 表达式返回一个指向对象的指针一样, delete 需要一个对象的地址
2、 delete 只适用于由 new 创建的对象

23.2 new 和 delete 的用法
针对类
Person* person = new Person;
相当于: C 语言中 开辟空间、验证是否开辟成功,初始化指针
Person* person = (Person*)malloc(sizeof(Person));

if(person == NULL)
{
return 0;
}
person->Init();
对应的 delete person;

................................................................................................................................................................................

另外: new, delete 和 malloc, free 区别:
malloc free 是库函数, new 和 delete 是运算符
malloc free 不调用构造、析构, new 调用构造 delete 调用析构
malloc 返回值 void * , new 返回该类型对象的指针

................................................................................................................................................................................

注意:正常: Person* person = new Person;
不要: void* person = new Person;
原因: delete person; 不会调用析构函数 // 除非 delete (Person*)person

................................................................................................................................................................................

2、针对数组
特别注意:在堆区创建数组,必须提供默认构造函数 !!!!
//创建字符数组
char* pStr = new char[100];
//创建整型数组
int* pArr1 = new int[100];
//创建整型数组并初始化
int* pArr2 = new int[10]{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
//释放数组内存
delete[] pStr;
delete[] pArr1;
delete[] pArr2;

相关推荐

其实TensorFlow真的很水无非就这30篇熬夜练

好的!以下是TensorFlow需要掌握的核心内容,用列表形式呈现,简洁清晰(含表情符号,<300字):1.基础概念与环境TensorFlow架构(计算图、会话->EagerE...

交叉验证和超参数调整:如何优化你的机器学习模型

准确预测Fitbit的睡眠得分在本文的前两部分中,我获取了Fitbit的睡眠数据并对其进行预处理,将这些数据分为训练集、验证集和测试集,除此之外,我还训练了三种不同的机器学习模型并比较了它们的性能。在...

机器学习交叉验证全指南:原理、类型与实战技巧

机器学习模型常常需要大量数据,但它们如何与实时新数据协同工作也同样关键。交叉验证是一种通过将数据集分成若干部分、在部分数据上训练模型、在其余数据上测试模型的方法,用来检验模型的表现。这有助于发现过拟合...

深度学习中的类别激活热图可视化

作者:ValentinaAlto编译:ronghuaiyang导读使用Keras实现图像分类中的激活热图的可视化,帮助更有针对性...

超强,必会的机器学习评估指标

大侠幸会,在下全网同名[算法金]0基础转AI上岸,多个算法赛Top[日更万日,让更多人享受智能乐趣]构建机器学习模型的关键步骤是检查其性能,这是通过使用验证指标来完成的。选择正确的验证指...

机器学习入门教程-第六课:监督学习与非监督学习

1.回顾与引入上节课我们谈到了机器学习的一些实战技巧,比如如何处理数据、选择模型以及调整参数。今天,我们将更深入地探讨机器学习的两大类:监督学习和非监督学习。2.监督学习监督学习就像是有老师的教学...

Python教程(三十八):机器学习基础

...

Python 模型部署不用愁!容器化实战,5 分钟搞定环境配置

你是不是也遇到过这种糟心事:花了好几天训练出的Python模型,在自己电脑上跑得顺顺当当,一放到服务器就各种报错。要么是Python版本不对,要么是依赖库冲突,折腾半天还是用不了。别再喊“我...

超全面讲透一个算法模型,高斯核!!

...

神经网络与传统统计方法的简单对比

传统的统计方法如...

AI 基础知识从0.1到0.2——用“房价预测”入门机器学习全流程

...

自回归滞后模型进行多变量时间序列预测

下图显示了关于不同类型葡萄酒销量的月度多元时间序列。每种葡萄酒类型都是时间序列中的一个变量。假设要预测其中一个变量。比如,sparklingwine。如何建立一个模型来进行预测呢?一种常见的方...

苹果AI策略:慢哲学——科技行业的“长期主义”试金石

苹果AI策略的深度原创分析,结合技术伦理、商业逻辑与行业博弈,揭示其“慢哲学”背后的战略智慧:一、反常之举:AI狂潮中的“逆行者”当科技巨头深陷AI军备竞赛,苹果的克制显得格格不入:功能延期:App...

时间序列预测全攻略,6大模型代码实操

如果你对数据分析感兴趣,希望学习更多的方法论,希望听听经验分享,欢迎移步宝藏公众号...

AI 基础知识从 0.4 到 0.5—— 计算机视觉之光 CNN

...

取消回复欢迎 发表评论: