在功能块中使用新运算符时存在于堆或堆栈上?

Live on heap or stack when use new operator within a function block?

本文关键字:于堆 存在 堆栈 运算符 功能块      更新时间:2023-10-16

例如:

void Func()
{
int* i = new int; // the simplest case
vector<int*> v = new vector<int*>; // another case, not sure if **new** is using correctly here
vector<int*>* vPointer = new vector<int*>; 
}
void main()
{
Func();
}

因此,如果我为函数中的局部变量分配动态内存(通过使用 new 运算符(,

  1. 它们生活在堆上还是堆上?
  2. 当程序退出函数时,它们是否仍在堆上晃来晃去或作为函数变量销毁?
  3. 我可以在非指针类型上使用 new 运算符吗?以后如何删除(或返回分配的堆内存(它?

谢谢!

int i = 3;

这将在堆栈上创建类型int的对象。(C++标准使用术语"自动存储",我通常坚持正确使用正式术语,但"堆栈"和"堆"深深嵌入在编程词汇中,所以"堆栈"和"堆"作为技术术语很好(。

int *ip = 0;

这将在堆栈上创建类型为int*的对象。ip持有空指针。

int *ip = new int;

这将在堆栈上创建一个类型int*的对象,就像上一个对象一样。它包含指向堆上的内存的指针(请参阅前面的括号;正式术语是"免费存储"(。你知道内存在堆上,因为这就是operator new的作用。

完成堆内存后,您必须释放它:

delete ip;

如果不删除它并且创建它的函数返回,则保存指针的局部变量 (ip( 将消失。内存已分配,但尚未释放,因此除非您将指针复制到其他位置,否则您无法获取分配的内存。这称为"内存泄漏"。