来自博文:
1. https://www.cnblogs.com/kissfu/p/3301436.html
2. https://blog.csdn.net/chen_jint/article/details/6139877

博主:亲福;请叫我涛哥0-0;

来源:博客园;CSDN;


new创建类对象,使用完后需使用delete删除,跟申请内存类似。所以,new有时候又不太适合,比如在频繁调用场合,使用局部new类对象就不是个好选择,使用全局类对象或一个经过初始化的全局类指针似乎更加高效。

一、new创建类对象与不new区别

下面是自己总结的一些关于new创建类对象特点:

  • new创建类对象需要指针接收,一处初始化,多处使用
  • new创建类对象使用完需delete销毁
  • new创建对象直接使用堆空间,而局部不用new定义类对象则使用栈空间
  • new对象指针用途广泛,比如作为函数返回值、函数参数等
  • 频繁调用场合并不适合new,就像new申请和释放内存一样

二、new创建类对象实例

1、new创建类对象例子:

CTest* pTest = new CTest();
delete pTest;

pTest用来接收类对象指针。
不用new,直接使用类定义申明:

CTest mTest;

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

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

CTest* pTest = NULL;

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

3、new对象指针作为函数参数和返回值

下面是天缘随手写一个例子,不太严谨。主要示意一下类指针对象作为返回值和参数使用。

class CTest {
public:int a;
};class CBest {
public:int b;
};CTest* fun(CBest* pBest) {CTest* pTest = new CTest();pTest->a = pBest->b;return pTest;
}int main() {CBest* pBest = new CBest();CTest* pRes= fun(pBest);if(pBest!=NULL)delete pBest;if(pRes!=NULL)delete pRes ;return -1;
}

4、总结:C++中用new和不用new创建类对象最本质区别:

  • 作用域不同:
  1. 不用new:作用域限制在定义类对象的方法中,当方法结束时,类对象也被系统释放了。(安全不会造成内存泄露);
  2. 用new:创建的是指向类对象的指针,作用域编程了全局,当程序结束时,必须用delete 来删除,系统不会自动释放。(不注意可能造成内存泄露)
  • 一个类对象,一个指向类对象的指针
// test.cpp : Defines the entry point for the console application.
//#include "stdafx.h"
#include <stdio.h>
#include <vld.h>//メモリリーク調査用class Person
{
private:char* pName;public:Person(char* pName){this->pName = pName;printf("[%s] is constructed.\n", this->pName);}~Person(){printf("[%s] is deconstructed.\n", this->pName);}
};void* Fun(){//Zhangsan是临时类对象,Fun函数返回時,Zhangsan被释放。Person Zhangsan("Zhangsan"); //pList是临时类指针,pList变量被释放,pList指向地址未被释放。(Lisi没有被释放)Person *pLisi = new Person("Lisi");return pLisi;
}
int main(int argc, char* argv[])
{printf("----------Fun begin ...\n");Person * pLisi = (Person*)Fun();printf("----------Fun end.\n");delete  pLisi;//释放Lisireturn 0;
}运行结果:
----------Fun begin ...
[Zhangsan] is constructed.
[Lisi] is constructed.
[Zhangsan] is deconstructed.
----------Fun end.
[Lisi] is deconstructed.
Press any key to continue

C++用new和不用new创建类对象区别相关推荐

  1. C++ 对象和实例的区别,以及用new和不用new创建类对象区别

    起初刚学C++时,很不习惯用new,后来看老外的程序,发现几乎都是使用new,想一想区别也不是太大,但是在大一点的项目设计中,有时候不使用new的确会带来很多问题.当然这都是跟new的用法有关的.ne ...

  2. python 元类 type_Python 使用元类type创建类对象常见应用详解

    本文实例讲述了Python 使用元类type创建类对象.分享给大家供大家参考,具体如下: type("123") 可以查看变量的类型;同时 type("类名", ...

  3. new创建类对象与直接定义的区别

    <div class="markdown_views"><h1 id="new创建类对象与直接定义的区别">new创建类对象与直接定义的 ...

  4. C++创建类对象时(无参)后不加括号与加括号的区别

    在不考虑用new动态创建对象的情况下,用最普通的 类名 对象名(参数); 的方法创建对象 先贴上最正常最普通的代码 #include<iostream> using namespace s ...

  5. python3 动态创建类对象并调用函数

    1. 首先import相关模块`import importlib` 2. 加载你想要加载的模块`model = importlib.import_module(模块名称)` 3. 获取类对象`api_ ...

  6. JavaScript 创建类/对象的几种方式

    在JS中,创建对象(Create Object)并不完全是我们时常说的创建类对象,JS中的对象强调的是一种复合类型,JS中创建对象及对对象的访问是极其灵活的. JS对象是一种复合类型,它允许你通过变量 ...

  7. 单例模式(全局地提供了一个类的唯一对象,该类的对象只创建一次,避免了创建类对象的开销)

    单例模式全局地提供了一个类的唯一对象,而且类的对象只需要创建一次,避免了创建类的对象开销 代码 single.h #ifndef HEADFILE #define HEADFILE#include & ...

  8. 【C++学习】对私有构造析构函数的思考:new一个类对象vs直接创建类对象

    前置知识: new的类对象需要手动delete.且使用堆空间.且只能用指针接收. 直接创建的类对象创建在栈中(或说堆栈).不需要手动delete,随着生存周期的结束(如所在的函数return了)而释放 ...

  9. java在类中创建一个对象_在另一个类中创建类对象

    我创建了两个类对象,每个对象都有一个构造函数,我试图让一个类对象成为另一个对象中的私有变量 . 这是我想要做的一个简单的例子,而不是实际的类名,而是一个例子 . 有更多的公共和私人变量,但为了简单起见 ...

最新文章

  1. 英特尔:80%的边缘数据都是视频数据!新成立物联网视频事业部,总部base中国...
  2. Windows下 MySQL命令 常用操作
  3. 协作与协同有什么区别_OA软件, BPM系统, 移动办公系统, 协同办公系统到底有什么区别...
  4. C++命名空间namespace
  5. Codeforces 1005D Polycarp and Div 3
  6. pytorch中unsqueeze()函数理解
  7. ServerSocketChannel API用法
  8. 办公自动化-表格的读写操作-xlrd-xlwt
  9. AcWing1075. 数字转换(树形DP)题解
  10. 百度App网络深度优化系列《一》DNS优化
  11. php168批量添加会员,ecshop快速批量添加会员
  12. Linux 内核软中断(softirq)执行分析
  13. 苏州外壳防护试验IP防尘防水测试IP65 IP66 IP69K
  14. 如何将微信电脑图片dat格式文件转换为jpg格式
  15. Linux一句话精彩问答(转载来自www.chinaunix.net)
  16. C#调用Qt写的dll,并处理异常来自 HRESULT:0x8007000B
  17. PS缩小图层兼如何使用蒙版
  18. course83_lab2_8086的寻址方式
  19. [Linux] Bash中大括号和小括号的使用
  20. 数据维度太多,咋办?我们整理了17种表现形式

热门文章

  1. OSX上摆脱vagrant搭建CoreOS集群
  2. Oracle MySQL社区版与Oracle MySQL企业版特征对比
  3. 【概念集锦】之 shim和polyfill
  4. 使用Pass提高效率
  5. 初学react实现路由跳转_如何使用React构建模因制作者:初学者指南
  6. 接口样板_完整的AWS Web样板
  7. 容器,VM和Docker的初学者友好介绍
  8. PLSQL Developer 安装与配置
  9. Simulink随手记
  10. PyTorch入门-语言模型