在这种情况下,函数完成后的内存如何在C++中释放
How memory released after function finished in C++ in this case
我是C++新手,我想知道在这种情况下内存是如何释放的:我有一个功能:
void myFunction() {
Foo foo; // at this line, new Foo instance created with constructor Foo(), instance1
foo = new Foo(params); // this line, reassign object, new another instance created - instance2
}
当程序传递此函数时,实例 1 是否自动释放?实例 2 的相同问题?
简短的回答是这不会编译。您正在尝试将Foo *
分配给Foo
。例如。在 GCC 上,这会生成编译错误:
在函数 'void myFunction()' 中:
错误:与"运算符="不匹配(操作数类型为"Foo"和"Foo*")
但是,让我们假装为了争论,这不是问题。上面会发生什么是foo
在本地myFunction
堆栈上构建默认值。在退出时,foo
超出范围,其析构函数被执行,因此此处没有泄漏。
另一方面,现在new Foo(params);
是一个不同的故事。这会在免费存储区上为 Foo
实例分配空间,并调用 Foo(params)
构造函数。当myFunction
退出时,指向此动态分配Foo
的指针仍然存在(即使您无法引用它),因为没有delete
运算符与之配对。除非您在代码中的其他位置delete
此指针,否则这将泄漏。
相关文章:
- 释放错误后堆使用
- G锁定铸造到基础上会释放模拟行为
- 在将变量声明为引用时,堆在释放后使用
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 正在理解智能指针,但出现错误:未分配正在释放的指针
- C++双重释放或损坏(out)
- 如何在c++中释放内存
- 使用全局声明的向量时,C++双重释放错误/损坏
- 为什么这个 std::queue/指向结构的指针列表直到 List.Size() == 0 才释放内存?
- 为什么瓦尔格林德在不释放恶意内存后没有报告任何问题?
- 调用析构函数以释放动态分配的内存
- 在函数范围内在堆栈上分配的数组在离开函数时是否总是被释放?
- COM :是否可以查看是否存在对我的某个 COM 对象的进程外引用?我可以释放它吗?
- 如何在向量中释放指针?
- std::unordered_map析构函数不释放内存?
- 在C++中释放内存期间,迭代器与指针有何不同
- 包含矢量指针的结构的内存释放问题
- C++:在被本地字符串捕获后释放或销毁 malloc'd char *?
- 错误:malloc:对象 0x7f9edf504080 的 *** 错误:未分配正在释放的指针
- 如果分配数组引发异常,是否应该释放该数组