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

C++系列笔记(二)

这些内容被组织成结构合理、联系紧密的章节,每章都可在1小时内阅读完毕,都提供了示例程序清单,并辅以示例输出和代码分析,以阐述该章介绍的主题。 本文是系列笔记的第二篇,欢迎各位阅读指正!...(星号)访问指向的数据,如: *pInteger #访问数据 将sizeof()用于指针时,结果与指针指向的变量类型无关,而是取决于使用的编译器和针对的操作系统。...将指针递增或递减时,其包含的地址将增加或减少指向的数据类型的sizeof(并不一定是1字节)。这样,编译器将确保指针不会指向数据的中间或末尾,而只会指向数据的开头。...检查使用new发出的分配请求是否得到满足 C++提供了两种确保指针有效的方法,默认方法是使用异常,即如果内存分配失败,将引发std::bad_alloc异常。这将导致应用程序中断执行。...int* pAge = new int[5368709111]; delete[] pAge; } catch (bad_alloc)

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

    C++ new的三种面貌

    也就是说我们在使用运算符new时,其最终是通过调用operator new()和placement new()来完成堆对象的创建工作。使用new operator时,其完成的工作有如下三步: ?...因此,当我们经常按照如下方式使用new operator时: string* sp=new string(“hello world”); 实际上等价于: //第一步:申请原始空间,行为类似于malloc...operator new()的函数原型一般为 void* operator new (std::size_t size) throw (std::bad_alloc); 具体实现如下: void *__...3.placement new() 一般来说,使用new申请空间时,是从系统的堆中分配空间,申请所得空间的位置根据当时内存实际使用情况决定。...(3)万不得已才使用placement new(),只有当你真的在意对象在内存中的特定位置时才使用它。例如,你的硬件有一个内存映象的I/O记时器设备,并且你想放置一个Clock对象在那个位置。

    57521

    《C++Primer》第十二章 动态内存

    无论何时我们拷贝一个shared_ptr,计数器都会递增: 用一个shared_ptr初始化另一个shared_ptr 将shared_ptr作为参数传递给一个函数 作为函数的返回值 当我们给一个shared_ptr.../ 当我们返回p时,引用计数执行了递增操作 } // p离开了作用域,但它指向的内存不会被释放掉 由于在最后一个shared_ptr销毁前内存都不会释放,保证shared_ptr在无用之后不再保留就很有必要.../ 使用连接 // 如果我们再f退出时忘记使用disconnect, 就无法关闭c了 } 由于connection没有析构函数,因此不能在f结束时由析构函数自动关闭连接。...拷贝和填充未初始化内存的算法 allocator算法包括: uninitialized_copy(b,e,b2):从迭代器b和e指出的输入范围中拷贝元素到迭代器b2指定的未构造的原始内存中 uninitialized_copy_n...(b,n,b2):从迭代器b指向的元素开始,拷贝n个元素到b2开始的内存中 uninitialized_fill(b,e,t):在迭代器b和e指定的原始内存范围内创建对象,对象的值均为t的拷贝 uninitialized_fill_n

    1.4K10

    故障分析 | 查询 ps.data_locks 导致 MySQL hang 住

    爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。...在 table_data_locks.cc 文件的 table_data_locks::rnd_next 函数中: 代码解释:catch (const std::bad_alloc &) 用来捕获 std...::bad_alloc 类型的异常,当 try 块中抛出 std::bad_alloc 异常时,调用 my_error 打印错误信息,并返回 ER_STD_BAD_ALLOC_ERROR,结束执行。...std::bad_alloc 内存异常,会直接被 catch 模块获取,抛出异常结束执行,无法执行到 trx_sys_mutex_exit() 释放互斥锁,导致了 trx_sys->mutex 互斥锁的残留...本次故障就是执行 trx_sys_mutex_enter() 后迭代扫描锁记录时发生了内存分配异常,trx_sys_mutex_exit() 释放互斥锁的操作未执行,残留了下来; 由于 trx_sys-

    12010

    C++内存分配失败的那些事儿

    默认情况下,new会在内存分配失败时抛出std::bad_alloc异常。...例如: int* ptr = new int[100]; //如果分配失败,将抛出std::bad_alloc异常 这使得程序在遇到内存分配失败时能够及时发现并处理错误。...示例如下: int* ptr = new(std::nothrow) int[100]; //如果分配失败,ptr将为nullptr 使用std::nothrow后,内存分配失败时,new操作符将返回nullptr...5.适用场景分析 抛出异常:当程序对内存分配失败的容忍度较低,且希望通过异常机制来集中管理错误时,使用new操作符的默认行为抛出std::bad_alloc异常是比较合适的。...此方式可以确保程序在内存分配失败时及时中断,避免进一步的错误发生。 返回空指针:当程序希望在内存分配失败时继续运行,并且需要手动处理失败的情况时,可以使用std::nothrow来避免抛出异常。

    14610

    “new出对象“原理的深层解密

    需要注意的是,catch语句块中的参数类型应为const std::bad_alloc&,因为bad_alloc是标准异常类,它派生自std::exception,通常以常量引用的形式传递给异常处理代码...构造函数和析构函数调用: (1)使用new分配内存时,会自动调用对象的构造函数进行初始化。 (2)使用malloc分配内存时,不会调用对象的构造函数,需要手动调用构造函数初始化对象。...(3)同样,使用delete释放new分配的内存时,会自动调用析构函数进行清理工作。而使用free释放malloc分配的内存时,不会自动调用析构函数,需要手动执行清理操作。...内存大小计算: (1)使用malloc分配内存时,需要显式指定要分配的内存块的大小,以字节为单位。 (2)使用new分配单个对象时,编译器会自动计算所需的内存大小,以对象的类型为基础。...异常处理:new在分配内存失败时,会抛出std::bad_alloc异常,而malloc在分配内存失败时,返回NULL指针。

    19530

    《C++Primer》第十三章 拷贝控制

    拷贝构造函数在几种情况下都会被隐式地使用,因此拷贝构造函数通常不应该是explicit的。 1.1 合成拷贝构造函数 当我们没有为一个类定义拷贝构造函数时,编译器会为我们定义一个。...1.4 拷贝初始化的限制 当我们使用explicit关键字声明构造函数时,它将只能以直接初始化的形式使用,而且编译器不会再自动转换过程中使用该构造函数。...一般有两种选择: 使类的行为像一个值:意味着它有自己的状态,当我们拷贝一个像值的对象时,副本和原对象是完全独立的,改变副本不会对原对象有任何影响 使类的行为像一个指针:当我们拷贝一个这种类时,副本和原对象使用相同的底层数据...引用计数的工作方法: 每个构造函数需要创建一个引用计数,当我们创建一个对象时将计数器初始化为1 拷贝构造函数不分配新的计数器,而是拷贝给定对象的数据成员,包括计数器,同时需要递增共享的计数器 析构函数递减计数器...新标准库中定义了一种移动迭代器move iterator适配器,一个移动迭代器通过改变给定迭代器的解引用运算符的行为来适配此迭代器。

    1.6K40

    【C++11】std::async函数介绍及问题梳理

    (延迟执行,在调用 std::future::get() 或 std::future::wait() 时执行)。...在 C++ 中,当 new 操作符无法分配所需的内存时,会抛出 std::bad_alloc 异常,但std::async 不会直接抛出该异常。...如果系统内存不足,std::vector 的构造函数将抛出 std::bad_alloc 异常。...在使用 std::async 时,如果系统线程不够,可能会导致无法启动新线程而引发异常【这通常不是由于内存不足引起的,而是由于达到了系统对同时运行线程数量的限制】 【示例】系统线程不够抛异常 #include...operator new 中,当 simulate_allocation_failure 被设置为 true,意味着模拟分配失败时,使用 throw std::bad_alloc(); 语句来抛出 std

    60610

    【C++】智能指针详解

    ,计数器都会递增。...当我们给shared_ptr赋予一个新值或是shared_ptr被销毁(例如一个局部的shared_ptr离开其作用域)时,计数器就会递减,一旦一个shared_ptr的计数器变为0,它就会自动释放自己所管理的对象...;//如果分配失败,new抛出std::bad_alloc int *p2 = new (nothrow)int;//如果分配失败,new返回一个空指针 我们称这种形式的new为定位new,定位new表达式允许我们向...bad_alloc和nothrow都在头文件new中。 释放动态内存 为了防止内存耗尽,在动态内存使用完之后,必须将其归还给系统,使用delete归还。...在创建或reset一个这种unique_ptr类型的对象时,必须提供一个指定类型的可调用对象删除器。

    92430

    【C++】内存管理

    (size) == 0) { // report no memory // 如果申请内存失败了,这里会抛出bad_alloc 类型异常 static const std::bad_alloc...,如果是多个对象,[]中指定对象个数即可 malloc的返回值为void*, 在使用时必须强转,new不需要,因为new后跟的是空间的类型 malloc申请空间失败时,返回的是NULL,因此使用时必须判空...A类和B类中都是两个整型,应该都是需要80个字节,但当我们转到反汇编查看时可以发现,B类申请的空间大小和我们预期的一样,但是A类多申请了4个字节空间。...这4个字节的空间存的是类型个数N,为了后面调用N次析构函数,而B类时没有存类型个数是因为B类中没有显示的写析构函数,并且B类中没有指向资源也可以不需要析构函数,所以编译器直接将这一步优化掉了。...有时候我们不规范地去使用操作符编译器也不会报错,但这只是偶然的,也许是编译器将我们的错误优化了。 规范起见一定要正确匹配使用,不要错配。

    9410

    【C++】STL 容器 - vector 动态数组容器 ⑥ ( 使用迭代器遍历 vector 容器步骤 | 获取指容器向首元素的迭代器 begin 函数 | 获取末尾迭代器 | * 迭代器解引用 )

    一、 使用迭代器遍历 vector 容器步骤 1、使用迭代器遍历 vector 容器的步骤 使用 迭代器 遍历 vector 容器 , 首先 , 获取 起始范围 迭代器 , std::vector<int...= vec.end(); 2、代码示例 - 使用迭代器遍历 vector 容器 代码示例 : #include "iostream" using namespace std; #include "vector...会 返回 迭代器所指向的元素的引用 ; 解引用一个迭代器时,会得到它所指向的元素的值 ; operator* 返回的是元素的引用 , 而不是元素的副本 ; 如果 通过得到的引用 修改了该元素的值 ,...对象 进行自增操作 , 使迭代器指向 下一个元素 , 这两个函数 都只能用于 非常量迭代器 ; 前置递增操作符 ++ : 返回一个引用到修改后的迭代器本身 , 允许你在一个语句中递增迭代器并使用它...; 后置递增操作符 ++ : 返回一个新的迭代器 , 该迭代器指向下一个元素 , 原来的迭代器保持不变 ; 这个操作符重载了 int 参数,以避免与前置递增操作符的优先级混淆 代码示例 :

    2.9K10
    领券