1

我想知道当我声明一个变量并在函数或方法之外初始化一个值时使用了哪些内存空间,例如,

// CBar.h>
class CBar
{
public:
   CBar();
   ~CBar();
};

// CBar.cpp
std::string const NAME = "mr.foo";

CBar::CBar()
{
   std::cout << NAME << std::endl;
}

CBar::~CBar()
{
}

我在方法之外声明的 NAME 变量。声明和初始化这个 NAME 变量有什么问题吗?每次我创建 CBar 实例时,NAME 变量仍然存在吗?

谢谢。

4

2 回答 2

4

在您的代码中,NAME 是一个静态变量(如文件 CBar.cpp 中的全局变量)。它在程序的一开始就被实例化一次,并且在整个程序中都存在(内存保持分配状态)。

无论您实例化或删除 CBar 对象多少次,值/内存将始终可访问(从 CBar.cpp 中),因为该变量独立于 CBar 类。

从技术上讲,静态内存存在于初始化的数据段中。请参阅此答案以获得对内存区域的良好解释: 堆栈或堆中 C++ 中的全局内存管理?

于 2013-10-27T03:25:27.153 回答
2

NAME 变量是全局的。它从 main() 之前一直存在到它返回之后。如果以下声明包含在另一个源文件中,则可以从另一个模块链接到它。

extern std::string const NAME;

如果您不希望这被允许,您应该如下所示声明它。

static std::string const NAME;

现在它只会“污染”CBar.cpp 中的标识符名称空间。如果您想避免这种情况,您需要将其设为 CBar 的私有/受保护成员变量。

于 2013-10-27T03:25:56.483 回答