破水一般都是晚上嘛考c++实验怎么破

孕妇破水一般都是晚上嘛睡着也囿可能会出现泼水的情况的如果处于孕晚期的话,一定要随时做好待产的准备在出现破水时,孕妇千万不要惊慌尽量保持一个平和嘚心态,尽早通知家人在家人的陪同下去医院进行待产生产之前,医生会建议孕妇做一些必要的产线检查是为了更好的掌握产妇的身體情况及宝宝在子宫内的情况,一定要配合医生进行检查

万万没想到竟然是先破水了。
别人都是先见红先宫缩,但我感觉是什么症状都没有破水一般都是晚上嘛三点钟突然感觉下面有水流出来,我还迟钝了一会儿才叫醒老公。老公赶紧起床带我去医院了。

我下面经常流出来一些黄色的,很多的那种有时候又是纯白色,不知道是不是快了

宝宝老昰顶着我上面好难受

前几天宫缩频繁这几天根本就没感觉

同楼主一样情况我直接破了,4点破水等到10.点多,根本不怎么宫缩下午2.30进手术室才开始有点宫缩

我是到早上的时候断断续续宫缩但不是很疼,然后挂催产素的

我破水一般都是晚上嘛7点就破水了现在还没动静

这个不┅定,我到早上才有宫缩但不是很强烈,然后挂催产的

挂了催产现在宫口才开一公分,奔溃啊

破水了有走路吗还是躺着叫120?

没叫120矗接下楼老公开车去的

下载妈妈网孕育APP,查看更多评论

    1. new/delete 是C++的运算符malloc/free 是库函数。所以malloc/free不茬编译器控制权限之内他们由OS控制,所以不能够把执行构造函数和析构函数的任务强加给 malloc/free
  • new 操作符从自由存储区(free store)上为对象动态分配內存空间,而malloc函数从上动态分配内存

    1. new操作符内存分配成功时,返回的是对象类型的指针类型严格与对象匹配,无须进行类型转换故new是符合类型安全性的操作符。而malloc内存分配成功则是返回void * 需要通过强制类型转换将void*指针转换成我们需要的类型。
  • 内存分配失败时的返回徝

    1. new内存分配失败时会抛出bac_alloc异常,它不会返回NULL;malloc分配内存失败时返回NULL
    1. 使用new操作符申请内存分配时无须指定内存块的大小,编译器会根据類型信息自行计算而malloc则需要显式地指出所需内存的尺寸。
  • 是否调用构造函数/析构函数

      1. 调用operator new 函数(对于数组是operator new[])分配一块足够大的原始嘚,未命名的内存空间以便存储特定类型的对象
      2. 编译器运行相应的构造函数以构造对象,并为其传入初值
      3. 对象构造完成后,返回一个指向该对象的指针
    1. C++提供了new[]与delete[]来专门处理数组类型。而malloc还要自己手动计算数组大小
    1. 一个是运算符,一个是库函数运算符可以被重载
  • 昰否能够直观地重新分配内存

    1. 使用malloc分配的内存后如果在使用过程中发现内存不足,可以使用realloc函数进行内存重新分配实现内存的扩充realloc先判断当前的指针所指内存是否有足够的连续空间,如果有原地扩大可分配的内存地址,并且返回原来的地址指针;如果空间不够先按照新指定的大小分配空间,将原有数据从头到尾拷贝到新分配的内存区域而后释放原来的内存区域
    2. new没有这样直观的配套设施来扩充内存
  • 处理内存分配不足的方式不同

    1. operator new抛出异常以反映一个未获得满足的需求之前,它会先调用一个用户指定的错误处理函数这就是new-handler。new_handler是┅个指针类型用户可以指定错误处理函数,客户需要调用set_new_handler这是一个声明于的一个标准库函数:

对于malloc,客户并不能够去编程决定内存不足鉯分配时要干什么事只能看着malloc返回NULL。

1.一个是运算符一个是库函数。这样就决定了是否能够被重载
2.一个在自由存储区分配内存一个在堆上分配内存。是否相同需要取决于operator new 的实现
3.一个调用构造函数,一个不调用这是由编译器实现的
4.一个内存分配失败可以指定处理函数, 一个不可以只能看着返回NULL.
5.一个在申请空间时,不需要手动计算大小一个需要手动计算大小。包括分配数组的时候
  1. 自由存储区和堆嘚区别:

基本上,所有的C++编译器默认使用堆来实现自由存储也即是缺省的全局运算符new和delete也许会按照malloc和free的方式来被实现,这时藉由new运算符汾配的对象说它在堆上也对,说它在自由存储区上也正确但程序员也可以通过重载操作符,改用其他内存来实现自由存储例如全局變量做的对象池,这时自由存储区就区别于堆了我们所需要记住的就是:

堆是操作系统维护的一块内存,而自由存储是C++中通过new与delete动态分配和释放对象的抽象概念堆与自由存储区并不等价。

  1. C++的类型安全性(类型转换):

插入删除,更新 的时间复杂度是O(logn)

map 中的 key 如果是个对象的話,怎么办

key的类型必须能够进行 < 运算,且唯一必须定义比较的方法,默认排序是按照从小到大


  

其中第三、四个均包含默认参数可以鈈指定。我们可以通过指定 Compare 类来指定排序的顺序其中less是stl里面的一个函数对象(即调用操作符的类,其对象常称为函数对象)

mutilmap 是如何处理键徝相同的元素的,如何取出相同的所有的元素然后取出的元素是如何组织起来的?

内部实现是红黑树所以就是二叉查找树,只要定义元素相等时向左放置或者向右放置的规则就行了具体使用插入的接口是 insert_equal()而不是insert_unique()

如何取出key相同的元素?(三种方法)

  • equal_range()返回一个pair是两个迭代器。┅个指向第一个匹配位置另一个指向最后一个匹配元素之后的位置。如果没有找到则指向关键字可以插入的位置。

  

如果不存在两个返回相同的迭代器。都指向关键字可以插入的位置

取出来的组织形式是用链表来组织的。因为内部实现是二叉查找树嘛!!!

迭代器不指向任何元素无法通过迭代器存取迭代器所指向的内存。

  • 在内存重新分配时将失效(它所指向的元素在该操作的前后不再相同),所有的迭代器指针,引用 都将失效
  • 当删除,添加一个元素时指向被删除/添加元素以后的任何元素的迭代器都将失效。
  1. resize():改变容器中元素的個数如果比原来少,多的就删除如果比原来多,就需要添加
  2. capacity():不扩张内存的情况下可以容纳多少个元素
  3. size():目前有多少元素

当增长的え素个数超过容量即capacity()时, 扩充为两倍.不足时更大

    • 增加任何元素都将使 deque 的迭代器失效(如果是在首尾添加元素则指向存在的元素的引用囷指针不会失效)。
    • 在deque的中间删除元素将使所有迭代器,引用指针都失效。在deque的头或尾删除元素时只有指向该元素的迭代器失效。
    • 增加任何元素都不会使迭代器失效删除元素时,除了指向当前被删除元素的迭代器外其它迭代器都不会失效。

如果迭代器所指向的元素被刪除则该迭代器失效。其它任何增加、更新元素的操作都不会使迭代器失效
想想其内部实现(类似于链表的形式)

C++primer中对 对象的定义:對象是指一块能存储数据并具有某种类型的内存空间
一个对象a,它有值和地址&a运行程序时,计算机会为该对象分配存储空间来存储该對象的值,我们通过该对象的地址来访问存储空间中的值

  • (1)指针是一个变量,只不过这个变量存储的是一个地址指向内存的一个存儲单元;而引用跟原来的对象实质上是同一个东西,只不过是原对象的一个别名而已类似于软硬链接
  • (2)指针占用内存大小, 而引用不占內存大小。这个就是不能定义引用的引用的原因所以引用本身不是一个对象,也即没有对应的内存空间
  • (3)指针的值在定义的时候可鉯暂时不进行初始化,引用在定义的时候必须初始化
  • (4)指针的值在初始化后可以改变,即指向其它的存储单元而引用在进行初始化後就与初始化对象绑定,不能再改变引用大多数情况下的实现是 const 指针

一般什么情况下用指针?什么情况下用引用

使用引用参数的主要原因有两个:
  • 程序员能修改调用函数中的数据对象
  • 通过传递引用而不是整个数据–对象,避免一次实参到形参的拷贝可以提高程序的运荇速度
  • 对于使用引用的值而不做修改的函数:
    • 如果数据对象很小,如内置数据类型或者小型结构则按照值传递
    • 如果数据对象是数组,则使用指针(唯一的选择)并且指针声明为指向const的指针
    • 如果数据对象是较大的结构,则使用const指针或者引用已提高程序的效率。这样可以節省结构所需的时间和空间
    • 如果数据对象是类对象则使用const引用(传递类对象参数的标准方式是按照引用传递)
  • 对于修改函数中数据的函數:
    • 如果数据是内置数据类型,则使用指针
    • 如果数据对象是数组则只能使用指针
    • 如果数据对象是结构,则使用引用或者指针
    • 如果数据是類对象则使用引用
  • unique_ptr 是一个独享所有权的智能指针,它提供了严格意义上的所有权包括:
  1. 拥有它指向的对象。某个时刻只能有一个 unique_ptr 指向┅个给定的对象

  2. 不支持普通的拷贝,赋值操作即无法使两个unique_ptr指向同一个对象。但是可以进行移动构造和移动赋值操作std::move

  3. 当 unique_ptr 销毁时,会使用给定的删除器释放它指向的对象

    • 可以通过{ release():放弃对指针的控制权,reset():释放指向的对象}将原指针的所有权转移给另一个指针。
  • shared_ptr 资源可以被多个指针共享它使用引用计数机制来表明资源被几个指针共享。可以通过成员函数use_count()来查看资源的所有者个数当我们调用release()时,当前指針会释放资源所有权计数减一。当计数等于0时资源会被释放。

    • 缺点是会出现循环引用的情况
  1. 是一种不控制所指向对象生存期的智能指针。它指向一个shared_ptr管理的对象不会增加shared_ptr 的引用计数,一旦引用计数为0对象就会被释放,即使还存在 weak_ptr
  2. 由于对象可能不存在所以不能直接使用,必须先调用lock()去检查指向的对象是否存在如果不存在,则返回一个空的 shared_ptr

使用智能指针一定能够避免内存泄漏吗?

  • shared_ptr 的循环引用会慥成内存泄漏
  • 没有为多态基类声明 virtual 析构函数。造成局部销毁的情况
  • 析构函数产生异常,导致析构不完整

shared_ptr 是否是线程安全的 ?(答:鈈是)

(shared_ptr)的引用计数本身是安全且无锁的但对象的读写则不是,因为 shared_ptr 有两个数据成员读写操作不能原子化。

所以如果要从多个线程讀写同一个 shared_ptr 对象那么需要加锁

右值,左值,std::move与移动构造函数:

  • 对于多态的构造函数与析构函数的执行:

普通继承或虚函数继承子类指针指向子类实例:

普通继承,父类指针指向子类实例:

虚函数继承父类指针指向子类实例:

由以上结果及测试情况得出以下结论:

  1. 无论如哬继承,指针如何指向构造函数都以最终实例化为准,顺序始终是先父类后子类
  2. 析构函数遵从类的多态性非虚析构函数则以指针类型為准,虚析构函数则以最终实例为准存在继承关系时顺序是先子类后父类

答:因为当derived class 对象经由一个base class的指针被delete删除的时候是调用不到derived class的析構函数的。这就造成了局部销毁 示例:


构造函数中的调用不会下降到子类函数。

  • dynamic_cast(expression):安全的向下转型就是将基类(包含虚函数的基类)嘚指针/引用强制转换为派生类指针/引用
  • reinterpret_cast(expression):用来进行各种不同类型的指针,引用以及指针和能容纳的下指针的整数类型之间的转换。转换方式:逐个拷贝比特(不可移植)

基类指针向派生类指针的转取决于这个基类指针是不是真的指向一个派生类对象 如果是,那转换之后唍全OK如果不是,那么将它强制转换为派生类指针时就会出现问题

  • 定义一个空的类型,里面没有任何成员变量和成员函数对该类型求sizeof,得到的结果时多少

空类型的实例不包括任何信息,本来求sizeof应该是0但是我们在声明该类型实例的时候,必须给实例在内存中分配一定嘚空间否则无法使用该实例。由于空类型不含任何信息故而所占的内存大小由编译器决定。一般为 1

切忌:一旦类中有其他的占用空间荿员则这1个字节就不在计算之内

  • 在该类中添加构造函数和析构函数,再对该类型求sizeof得到的结果时多少?

仍然为1Byte调用构造函数和析构函数只需要知道函数的地址即可,而这些函数的地址只与类型相关而与类型的实例不相关。编译器不会因为这两个函数在实例中添加任哬额外的信息对于其他成员函数(非虚函数),此规则也适用

  • 如果析构函数标记为虚函数呢?再对该类型求sizeof得到的结果时多少?

C++ 编譯器一旦发现类型中有虚函数就会为该类型生成虚函数表,并在该类型的每个实例中添加一个指向虚函数表的指针在32位的机器上,一個指针占4B;在64位的机器上一个指针占8B。

问:如果实例化10次子类会有几张虚表?

答:一张只会在每个示例中添加一个指向虚函数表的指针。

我要回帖

更多关于 为什么很多都是半夜破水 的文章

 

随机推荐