对象指针接收new创建的对象(申请的内存空间)

本文探讨了C++中使用new关键字创建对象与普通方式定义对象之间的差异。重点讲解了new创建对象需要手动释放内存以避免内存泄漏的问题,以及类指针的定义与使用,对比了不同创建方式下对象生命周期的管理。
参考: https://www.cnblogs.com/wpcblog/p/3503199.html
二、new创建类对象实例
  • 1、new创建类对象例子:
    CTest* pTest = new CTest();//pTest指针指向的该对象的入口地址

delete pTest;

pTest用来接收类对象指针。

不用new,直接使用类定义申明:

CTest mTest;

此种创建方式,使用完后不需要手动释放,该类析构函数会自动执行。而new申请的对象,则只有调用到delete时再会执行析构函数,如果程序退出而没有执行delete则会造成内存泄漏。

  • 2、只定义类指针
    这跟不用new申明对象有很大区别,类指针可以先行定义,但类指针只是个通用指针,在new之前并为该类对象分配任何内存空间。比如:

CTest* pTest = NULL;

但使用普通方式创建的类对象,在创建之初就已经分配了内存空间。而类指针,如果未经过对象初始化,则不需要delete释放。

### C语言结构体指针申请内存的后果分析 在C语言中,如果未给结构体指针申请内存空间,则可能会引发一系列严重的问题。以下是具体的影响和原因: #### 1. **野指针问题** 当声明一个结构体指针而未对其进行初始化或分配内存时,该指针会成为一个野指针[^3]。野指针是指向未知地址的指针,在程序运行过程中可能指向任何随机位置的数据。尝试通过这样的指针访问或修改数据会导致不可预测的行为,甚至触发段错误(Segmentation Fault),从而终止程序。 #### 2. **未定义行为** 由于未分配内存,直接使用未初始化的结构体指针会对不确定的位置执行读写操作。这种情况下产生的结果完全依赖于编译器实现及其所处环境,因此属于标准中的“未定义行为”范畴[^4]。这意味着同样的代码片段在不同的平台上可能现截然不同的表现形式——有时看似正常工作,但在其他时候却崩溃或者返回垃圾值。 #### 3. **数据丢失与覆盖风险** 假设有一个函数接收了一个未经适当处理过的结构体作为参数,并试图存储某些重要信息到其中某个字段上;如果没有事先安排好足够的连续可用区域供其占用,则这些新录入的内容很可能被放置至非法区域内,进而破坏原有合法对象或其他部分已存在的有效资料[^5]。 ```c #include <stdio.h> #include <string.h> struct Person { char name[50]; }; void set_name(struct Person *person, const char *new_name){ if(person != NULL && new_name != NULL){ strncpy(person->name, new_name, sizeof(((struct Person *)0)->name)-1); person->name[sizeof(((struct Person *)0)->name)-1]='\0'; } } int main(){ struct Person *p; // 错误示范:没有为*p分配实际的空间就开始调用set_name() set_name(p,"Alice"); printf("%s\n", p->name); return 0; } ``` 上述示例展示了典型的错误场景之一:`main()` 函数内部仅仅创建了 `Person` 型的一个指针变量 `p`, 却从未真正预留可供容纳实体实例所需的那片特定领域之前便贸然将其传递给了另一个子程序去完成设定名字的任务。这必然会造成严重的逻辑缺陷乃至整个系统的不稳定状态。 --- ### 总结 为了防止以上提到的各种隐患发生,在运用涉及动态分配资源的技术手段构建应用程序期间务必遵循良好的编程习惯,比如始终记得先利用诸如 `malloc()` 或者 `calloc()` 这样的工具获取恰当大小的工作区然后再继续后续流程;另外也要养成及时释放不再使用的储备单元的好风气以免造成浪费现象的发生。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值