C/C++ 中的内存分配、负数组索引与指针技巧
1. 内存分配
在 C++ 编程中,我们常常会听到“在栈上分配内存”和“在堆上分配内存”这两种说法。下面来详细了解一下这两种内存分配方式。
1.1 栈上分配对象
栈上分配对象是一种常见的方式,示例代码如下:
void f()
{
// ...
Class o = Class(...);
// ...
};
在栈上分配对象时,使用简单的栈指针(SP)移动来分配内存。当函数退出,或者更准确地说,在作用域结束时,内存会被释放。此时,SP 会恢复到函数开始时的状态,并且会调用类的析构函数。在 C 语言中,分配的结构体的内存也是在函数退出时释放。
1.2 堆上分配对象
堆上分配对象的示例代码如下:
void f1()
{
// ...
Class *o = new Class(...);
// ...
};
void f2()
{
// ...
delete o;
// ...
};
在 C++ 中, new
实际上是 malloc()
的包装,而 delete
是 free()
的包装。由于内存块是在堆上分配的,因此必须使用 delete
显式地释放内存。在释