局部变量的析构函数是否始终保证在超出范围时被调用?

liz*_*isk 6 c++ destructor memory-management

编译器可以做出很多的优化(如内联的一些功能),我稍微怀疑不是分配给本地变量的所有存储在我的程序(基于OS X的系统监视器上)函数调用后清除,因此这就是我要问的原因:标准是否保证局部变量的所有析构函数在它们超出范围时都会被调用?

And*_*owl 9

是.根据C++ 11标准的3.7.3段:

块范围变量显式声明register或未显式声明staticextern具有自动存储持续时间.这些实体的存储将持续到创建它们的块为止.

但请注意,这涉及具有自动存储持续时间的变量.如果您使用动态创建对象new并将结果分配给本地原始指针,则只会销毁原始指针,而不是指向对象:

{
    int* foo = new int(42);
} // Here you have a memory leak: the foo pointer is destroyed,
  // but not the object foo pointed to
Run Code Online (Sandbox Code Playgroud)


nog*_*ard 7

是的,这是有保证的.

使用系统监视器监视内存使用情况可能不准确,因为应用程序不会将内存返回给系统.一旦分配它属于应用程序,即使您的对象被销毁,您可能看不到任何差异.

如果你想保证你的应用程序没有内存泄漏,你可能想要使用像valgrind这样的工具,或谷歌的drMemory或其他几个(google用于"内存泄漏检测").在这种情况下,您将获得有关分配,解除分配,泄漏,内存访问违规等的最准确信息.


ale*_*der 3

是的,可以保证每个超出范围的变量都会调用它的析构函数。

6.7 声明声明

2 具有自动存储期限(3.7.3)的变量在每次执行其声明语句时都会被初始化。在块中声明的具有自动存储持续时间的变量在退出块时被销毁(6.6)。