在功能块中使用新运算符时存在于堆或堆栈上?
Live on heap or stack when use new operator within a function block?
例如:
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 运算符(,
- 它们生活在堆上还是堆上?
- 当程序退出函数时,它们是否仍在堆上晃来晃去或作为函数变量销毁?
- 我可以在非指针类型上使用 new 运算符吗?以后如何删除(或返回分配的堆内存(它?
谢谢!
int i = 3;
这将在堆栈上创建类型int
的对象。(C++标准使用术语"自动存储",我通常坚持正确使用正式术语,但"堆栈"和"堆"深深嵌入在编程词汇中,所以"堆栈"和"堆"作为技术术语很好(。
int *ip = 0;
这将在堆栈上创建类型为int*
的对象。ip
持有空指针。
int *ip = new int;
这将在堆栈上创建一个类型int*
的对象,就像上一个对象一样。它包含指向堆上的内存的指针(请参阅前面的括号;正式术语是"免费存储"(。你知道内存在堆上,因为这就是operator new
的作用。
完成堆内存后,您必须释放它:
delete ip;
如果不删除它并且创建它的函数返回,则保存指针的局部变量 (ip
( 将消失。内存已分配,但尚未释放,因此除非您将指针复制到其他位置,否则您无法获取分配的内存。这称为"内存泄漏"。
相关文章:
- 为什么我的变量存在于其范围之外
- 堆分配的对象是否存在永不为空的唯一所有者?
- C++ 删除存在于另一个矢量中的矢量项,同时保留顺序
- 在功能块中使用新运算符时存在于堆或堆栈上?
- "new"创建的实例的所有成员变量是否都存在于堆上而不是堆栈上?
- C++17 和更新的 std::分配器是否适用于动态数量的自定义堆?
- 由于相同的文件名/类名存在于不同的SO中而导致的SEG错误
- 检查元素是否存在于二维矢量中
- 在另一个对象 B 中创建对象 A 时,对象 A 是否是对象 B 的本地对象,对象 A 是否会存在于对象 B 的实例化之外?
- 仅当元组中存在该类型时,将功能应用于元组元素
- C++实现代码中的字符串不应存在于输出二进制文件中.如何解决
- 在 C++ 中,映射相对于堆的优势是什么?
- g++ 未定义的引用,尽管符号存在于 *.so 文件中
- 我是否也应该包括 string.h,即使它存在于头文件中
- 控制一个字符串是否存在于另一个字符串中(以 C++ 为单位)
- 如何使用QT检查程序是否存在于路径中
- 在向量中查找值,而向量又存在于结构中
- C++如何编写一个函数来检查元素是否存在于动态分配的数组中
- 如何使用type_traits生成依赖于是否存在类专用化的代码?
- 适用于预先存在的类层次结构的函数的最佳模式