动态分配

在你的问题里。你用了两种方式创建对象。这两种方式基本的不同在于对象的存储时间。

当运行Object myObject;这句代码时。它作为自己主动变量被创建,这意味着当对象出了作用域时也会自己主动销毁。而当你使用new Object()这样的方式时,对象所拥有的内存是动态分配的。这表示直到你调用delete()方法对象才会被销毁。否则一直存在。当须要用动态分配内存来处理时,你应该仅仅使用动态分配的方式,也就是说,当你能够使用动态分配内存的时候就不要使用自己主动变量。

下面是可能会使用到动态分配的两种常见情况:

1.当想让对象在出了作用域后依旧存在——且确实就是之前存储在该内存中的对象。而不是对象的拷贝。假设你能够接受使用对象的拷贝或者移动(大部分情况下你应该这样),那么你更应该使用自己主动存储方式。

2. 当须要大量内存时,这样的情况下极易导致栈溢出。

当然假设这对你来说根本不是问题就更好了(大部分情况下这是不可能的)。这显然超出了C++的管辖范围,可是不幸的是,我们必须处理我们开发的系统中存在的这样的现实问题。

当你确实须要使用动态分配时,你应该将它封装到一个智能指针中或者其它能具有RAII特性的类型(比如标准容器)。智能指针提供动态分配内存的对象的全部权语义。比如std::unique_ptr和std::shared_ptr。

假设你可以合适的使用它,你基本上不须要自己管理内存(參见Rule of Zero这篇文章)。

指针

其实,指针除了用来实现动态分配内存外还有非常多其他的使用方法。可是当中大部分也都存在比它们更好的选择。就像前面说过的那样。除非你必须用到指针。否则不要贸然使用。

须要使用引用的情况:有的时候,你想调用的函数须要訪问你当前的对象本身(而不是它的拷贝)。那么你就须要使用指针作为參数进行传递(暂不论它是怎样分配的)。然而,在大部分情况下。使用引用会比指针更好,这也正是引用被设计的理由。注意一下,这里不须要像上面所说的那样去延长对象的生命周期。前面已经说过了,假设你能接受使用对象的拷贝。那么你就不是必需再使用引用了。

须要使用多态的情况:通常你仅仅能通过对象的指针或者引用来实现多态(也就是依据对象的动态类型来调用函数)。假设这就是你想要的,那么你就须要使用指针或者引用。相同,以指针为优先选择。

当对象可忽略时,通过传递一个空指针来实现对象是可选的属性:假设它是一个參数的话,你应该优先使用默认參数或者函数重载的方法。否则你应该选择一种能够封装这样的行为的类型,比如boost::optional(或者是std::optional)。

当你想减少文件间的编译依存关系从而节省时间:指针的一大特点在于你仅仅须要在前面声明一下指针指向的类型(而假设要使用实际的对象,你还须要定义一下)。

这样你就能减少你的编译单元之间的耦合性从而减少编译时间。

參考Pimpl idiom.

当你想调用C或者类似C风格的函数库的接口时:在这样的情况下。你不得不使用指针进行操作。

你唯一能做的事情就是要保证你的指针在不使用时要被释放。你也能通过智能指针来操作原指针,比如通过它来调用成员函数。

假设被调用库已经为你申请了空间而又希望你通过句柄来释放的话,利用智能指针封装起句柄并利用定制的析构器来释放内存无疑是一种合理的选择。

C++ 何时使用动态分配(即使用newkeyword)?何时使用指针?的更多相关文章

  1. 2013/10/24初学BOOST

    今天第一次接触学习boost库,虽然以前也听过boost,但是没有用心学习和使用此库. 学习的材料是:Boost_c++库.pdf RAII 智能指针的原理基于一个常见的习语叫做RAII:资源申请即初 ...

  2. ACM:统计难题 解题报告-字典树(Trie树)

    统计难题 Time Limit:2000MS     Memory Limit:65535KB     64bit IO Format:%I64d & %I64u Submit Status ...

  3. C输入输出函数与缓冲区

    #转 对C语言输入输出流和缓冲区的深入理解C语言缓冲区(缓存)详解缓冲区又称为缓存,它是内存空间的一部分.也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的 ...

  4. effective c++:资源管理

    对象管理资源 createInvestment 函数作用时创建一个invest对象: void f() { Investment *pInv = createInvestment(); // call ...

  5. C语言知识总结(3)

    数组 数组的特点: 只能存放一种类型的数据,比如int类型的数组.float类型的数组 里面存放的数据称为“元素” 初始化方式 ] = {, , }; ] = {,}; , , }; ] = {[]= ...

  6. C++对象创建与释放

    创建对象有以下四种形式: #include <iostream> using namespace std; class A{ private: int i; public: A(){ co ...

  7. RtlInitUnicodeString、IoCreateDevice、IoCreateSymbolicLink、IoDeleteDevice 四个 API 驱动函数的使用

    要解释"驱动对象",就得先从 DriverEntry() 说起: 做过C语言开发的都知道程序是从 main() 函数开始执行.在进行 Windows 驱动程序开发的时候没有 mai ...

  8. C语言的本质(16)——函数接口的传入参数与传出参数

    如果函数接口有指针参数,既可以把指针所指向的数据传给函数使用(称为传入参数),也可以由函数填充指针所指的内存空间,传回给调用者使用(称为传出参数),例如strcpy的函数原型为 char *strcp ...

  9. 全国计算机等级考试二级教程-C语言程序设计_第9章_数组

    四维数组,可用于航天卫星,三维+时间 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> ...

  10. levelDB跳表实现

    跳表的原理就是利用随机性建立索引,加速搜索,并且简化代码实现难度.具体的跳表原理不再赘述,主要是看了levelDB有一些实现细节的东西,凸显自己写的实现不足之处. 去除冗余的key template& ...

随机推荐

  1. js滚动事件实现滚动触底加载

    移动端触底加载时前端开发过程中常用功能,主要是通过三个值的大小来进行判断: 首先介绍jquery的写法,代码如下: $(window).scroll(function(){ var windowH=$ ...

  2. http响应的封装

    响应的封装: 资源的初始化 分析请求响应信息,根据状态响应码,发送不同的状态码 浏览器根据状态信息,做出不同的执行 构建正文,也就是根据浏览器客服端的请求发送响应信息: 发送响应:code 是状态码, ...

  3. hbase的几种访问方式

    Hbase的访问方式 1.Native Java API:最常规和高效的访问方式: 2.HBase Shell:HBase的命令行工具,最简单的接口,适合HBase管理使用: 3.Thrift Gat ...

  4. C++模板中的静态

    #include <iostream> #include <stdlib.h> using namespace std; template<class T> cla ...

  5. WAP 图片 lazyload

    原理是根据屏幕上的坐标找到需要做 lazyload 的区域 1,先监听 scroll 事件 ,scrolling_lt window.addEventListener('scroll', functi ...

  6. legend---十一、thinkphp事务中if($ans1&&$ans2){}else{}方式和try{}catch{}方式事务操作的区别在哪里

    legend---十一.thinkphp事务中if($ans1&&$ans2){}else{}方式和try{}catch{}方式事务操作的区别在哪里 一.总结 一句话总结:执行的条件其 ...

  7. [poj3974] Palindrome 解题报告 (hash\manacher)

    题目链接:http://poj.org/problem?id=3974 题目: 多组询问,每组给出一个字符串,求该字符串最长回文串的长度 数据范围支持$O(nlog n)$ 解法一: 二分+hash ...

  8. jquery的clone()引发的问题,下拉框点击没有反应

    此段代码是对某块元素的移位:上移.下移.对比修改前后的两段代码: 修改前: //点击移位 function move(obj,posi){ var al=$(obj).parent('li').par ...

  9. asp.net mvc5 文件下载上传

    下载:是通过点击a标签直接下载的方式,没有其他任何要求,在服务器上存在实体文件,不需要请求后台控制层 前段js: <a id="NF-DownLoad" authorize= ...

  10. [BeiJing2006]狼抓兔子 dijkstra+平面图最小割

    一眼裸的最大流求最小割,然而数据范围过大,跑不下来. 我们可以将平面图转成对偶图,并进行连边. 这样,每条边的长度就对应原图中的割边长度. 起点到终点的最短路即为最小割. 别用SPFA,会死的很惨 C ...