跳转至

内存分配和释放

指针指向的内存空间释放 指针指向NULL 防止野指针 乱指问题

静态变量初始化 在类的外面

有new就要delete

增加分配内存

如果分配的内存不够了 需要增加内存 不能在原来的基础上追加 可以重新分配一块儿大的。

原来的大小等于原来的个数乘以每个的大小

然后分配新的大小的内存

使用一个for循环 把旧的数据复制到新分配的内存里。

释放旧的指针 把新的内存的地址给指针

C++常见出错:delete忘了写,new和delete必须成对出现

delete void* 可能会出错

  • 除非void* 指针所指向的内容非常简单,否则可能会出错
  • 因为delete void* 不执行析构函数
  • 经验
  • 如果程序中发现内存丢失的情况,那么就搜索所有的delete语句,如果delete删除的是void* 类型,则可能是引起内存丢失的原因。

void* 是万能指针。可以用来指向任意类型的数据。

做设计的时候就喜欢用void* 类型,因为可以做通用存储类型,操作所有类型的数据。

例:

定义一个类Object

  • id 标识
  • 构造函数
  • 构造函数里 new 创建对象
  • 析构函数
  • 构造函数有new所以析构函数需要delete
class Object
{
    void* data;
    const int size;
    const char id;
public:
    Object(int sz, char c) : size(sz),id(c)
    {
        data = new char[size];
        cout << "正在构造对象, " << id << ", size = " << size << endl;
    }
    ~Object()
    {
        cout << "正在析构对象" << id << endl;
        delete[] data;
    }
};

void test()
{
    Object *a = new Object(40, 'a');//new就调用构造函数
    delete a;//上面new了就需要delete。不会内存泄漏

    //可能会出错情况
    void* b = new Object(40, 'b');
    delete b
}

new会创建对象,调用构造函数。 delete做delete操作但是不会调析构函数

上面例子中的data动态分配的内存就没有delete释放掉,只delete了b。所以就有内存泄漏。

b不是指向简单类型的数据。

总结:

上面的new一个Object就是分配一个内存,Object里面又有一个data,构造函数里又new一个data。不会调用析构函数则data会不释放。内存泄漏。