静态指针和其他奇怪的东西
static pointers and other curious stuff
请考虑以下代码。因此,我们有一些main.cpp文件,并声明了一个静态指针。
int main()
{
static int* array = new int[1000];
}
因此,在main结束之后,在程序结束运行之前,静态指针将从静态存储中删除。那么它分配的内存呢。何时删除阵列?它会泄漏吗?
当程序结束时,实际内存将释放给操作系统,因为程序结束了,但不是因为你释放了它。
所以,是的,你可以说它是泄漏的,尽管大多数程序员将泄漏称为持续发生的事情,而不是你意识到的一次性分配,无论如何都会被回收。
一旦程序退出,它的虚拟内存也会被吊销,因此在这种情况下不会发生内存泄漏。
下面链接中的详细答案将澄清您的所有误解。
https://stackoverflow.com/a/654766/2959769
应用程序退出后,堆上分配的所有内存都会返回到操作系统(*)(在大多数情况下,虽然我没有听说过操作系统,但这并不能实现。那么,这是内存泄漏吗?这取决于情况。
在这种简单的情况下,没有危害,但考虑以下情况:
class C
{
protected:
//file handles, network connections, database handles
public:
C()
{
//initialize resources
}
~C()
{
//release resources
}
};
static C* globals = new C[10];
在C++中,调用new
/new[]
直接连接到使用构造函数的初始化,而delete
/delete[]
也意味着调用特定类的析构函数。因此,在这种情况下,C
拥有的资源永远不会被释放——是的,globals
占用的内存将被释放,但它们的析构函数永远不会被调用。它可能有害也可能无害,但请记住:
- 如果您已经将数据写入文件,但没有关闭它,数据可能不会被刷新
- 如果您没有关闭临时文件,它可能不会被删除
- 在可能的情况下,网络连接应始终正常关闭
- 数据库连接也应该显式关闭
重点是,记忆并不总是最重要的部分。有时,不释放更复杂的资源可能会产生严重后果,从而导致程序的未定义行为。
(*)这怎么可能?大多数现代操作系统都有不同的"内存管理器"变体。Userland进程只看到所谓的虚拟内存,它在某种程度上与物理内存没有直接关系,这可能是你所期望的——它本质上将虚拟地址映射到计算机内存中的物理地址。程序终止后,它的整个虚拟空间被释放,所有由它映射的地址都可以用于其他进程。
(**)据我所知,DOS、Windows 3.x以及可能的MacOS 9及更早版本可能无法在进程终止后正确回收所有由进程分配的内存。但这些肯定不再使用了。
您的问题的答案取决于您对"泄漏"的定义,但我认为最好回答您想要问的问题:1000个int
的数组会自动销毁吗,就像我们调用了delete[] array;
一样。
答案是否定的。分配给new
或new[]
的所有内容都应与delete
或delete[]
解除分配。在您的示例中,只有指针本身是静态分配的,而不是它所指向的数组
- 结构和双指针隐藏在其他结构中,多层混淆
- 这个失败的测试是将零添加到空指针未定义的行为、编译器错误还是其他什么?
- 包含指向其他结构的指针向量的结构
- 我可以使用 decltype() 或其他东西通过指针获取真实类型吗?
- 在指针中对其他信息进行编码
- char* 除了作为C++中的指针之外,还有其他功能吗?
- C++ 指向其他类函数的指针函数
- 当动态库中的指针仍被其他库使用时,如何删除该指针
- 指向用随机指针归档的其他类对象的指针的c++向量
- Sizeof返回的是指针大小,而不是数组大小.有其他方法可以找到尺寸吗
- 如何知道指针是否已在其他地方释放
- 为什么C++让你把"->"符号放在指针上,把"."符号放在其他所有东西上?
- fprintf 不打印到文件,当文件指针在其他地方声明时
- QPointer::clear() 是删除其引用的指针,还是"Clears this QPointer object."其他含义?
- 与其他语言相比的 Ruby 和指针
- 如何在没有作弊引擎的情况下从其他应用程序获取指针地址?
- 为什么可以将所有类型转换为其他指针类型?
- 将指针类方法作为参数传递给其他类方法C
- 将指针与其他数据相关联
- 如何复制包含指向其他几个成员之一的指针的对象?