基础知识_Cpp

Cpp基础知识与常见题目。

结构体内存对齐问题

  • 为了提高内存的读取效率,编译器使用内存对齐的技术。
  • 1.首先结构体的总字节数需要是“对齐字节”的整数倍,如果不够,要在最后补到整数倍
  • 2.结构体内的每个成员的开始地址也有要求,开始地址需要是”该成员和对齐字节中较小的一个”的倍数。
  • 3.结构体作为成员时,该成员要从内部最大元素的整数倍开始存储。
  • 使用预编译命令可以控制对齐系数,#pragma pack(4)

拷贝构造函数的调用时机

  • 用一个类的对象去初始化另一个对象时。
  • 往函数中传递对象参数时。
  • 从函数中返回一个对象时。

在一个有指针对象的类中至少要实现哪三个函数

  • 拷贝构造函数、拷贝赋值运算符、析构函数

如果没有实现拷贝赋值运算符可能会遇到什么问题(深拷贝、浅拷贝)

  • 浅拷贝,只拷贝指针的值,深拷贝会再开辟一块新空间,连同指针在堆中指向的内容一块拷贝过去。
  • 当一个类中含有对象指针时,如果把该类的一个对象复制给另一个对象,这时会导致两个对象中的指针指向同一块内存,此时一个对象销毁,可能会导致另一个对象中的指针指向的内容被销毁。

new运算符

1
2
3
Foo* pf=new Foo;
...
delete pf;
  • 这里的new是一个运算符,里面包含两个阶段操作:(1)调用::operator new()函数配置内存;(2)调用Foo::Foo()构造对象内容。
  • delete也包含两阶段操作:先调用析构函数,再释放内存。
  • 上面的::operator new()与::operator delete()相当于c的malloc()与free();

set_new_handler

  • 该函数接收一个函数指针,当new或new[]失败时,就会执行传进来的函数。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    // new_handler example
    #include <iostream> // std::cout
    #include <cstdlib> // std::exit
    #include <new> // std::set_new_handler

    void no_memory () {
    std::cout << "Failed to allocate memory!\n";
    std::exit (1);
    }

    int main () {
    std::set_new_handler(no_memory);
    std::cout << "Attempting to allocate 1 GiB...";
    char* p = new char [1024*1024*1024];
    std::cout << "Ok\n";
    delete[] p;
    return 0;

持续更新~

欢迎与我分享你的看法。
转载请注明出处:http://taowusheng.cn/