内存分配和释放¶
指针指向的内存空间释放 指针指向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会不释放。内存泄漏。