【问题标题】:Global Dynamic Allcoated Variables in C++C++ 中的全局动态 Allcoat 变量
【发布时间】:2015-06-09 17:35:01
【问题描述】:

内存分为三种:静态内存(静态变量/成员、全局变量)、栈和堆。

全局变量的定义是在任何函数之外定义的变量。

我想知道下面的代码,

#include<iostream>
int *test=new int[5]();
int main(){
  return 0;
}

它可以被编译和运行。但我想知道的是,该数组分配在哪里?是堆上的全局变量吗?

C++ Primer 说全局变量将在程序结束时被释放。我的问题是,即使它们在堆上也会发生这种情况吗?

【问题讨论】:

标签: c++ memory-leaks heap-memory dynamic-memory-allocation static-memory-allocation


【解决方案1】:

指针test 只是一些变量(指针类型)。它被分配在内存的静态部分,但是它指向的(即 5 ints 的内存)是在堆上分配的一些内存块。后者不会自动取消分配。用于存储指针test(最常见的是 4 或 8 个字节,具体取决于机器)的内存在程序终止时确实会被标记为可用,但指针指向的内存不会被标记。为了说服自己,试试这个:

#include <iostream>

struct Foo
{
    Foo()
    {
        std::cout << "Foo()" << std::endl;
    }
    ~Foo()
    {
        std::cout << "~Foo()" << std::endl;
    }
};

Foo* pFoo = new Foo; // no automatic destructor call at exit, memory/resource leak

// destructor is called below, as Foo (and not Foo*) is now global 
// (and not a pointer-to-Foo that has no destructor, thanks @Konrad Rudolph)
Foo foo; 

int main()
{

}

【讨论】:

  • stackoverflow.com/questions/2204608/… 不同意你的回答。
  • @Richard 那不同,这里不适用。 *pFoo 不是全局对象——pFoo 是!如果有的话,C++ 绝对会调用pFoo 的析构函数。但是指针类型没有析构函数(Foo 有一个,Foo* 没有)。
  • @KonradRudolph 完全正确,很好的补充,这就是我想说的。 “指向”内存不是对象本身。我希望我在答案中说清楚了。
  • @KonradRudolph,感谢您的澄清,这是有道理的。这就像在堆栈上有一个原始指针,然后分配一个对象的地址,当指针超出范围时,原始指针变量消失但是在堆上分配的对象不会导致内存泄漏,某事unique_ptr 和它的兄弟姐妹被设计为在 C++11 中处理。那么如果你使用unique_ptrmake_unique 而不是new 会发生什么?虽然我认为除了特殊资源的特殊情况外,这没有什么意义。
  • @RichardChambers 相反,我认为在这里使用unique_ptr 可能经常很有用。无论如何,unique_ptr 有一个常规的析构函数,它会在运行时结束时被调用,而这个析构函数又会调用指针对象的析构函数。
猜你喜欢
  • 2013-02-18
  • 2015-06-12
  • 2012-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-17
  • 2015-10-04
  • 1970-01-01
相关资源
最近更新 更多