假设我有一个包含类定义的头文件armorshop.h,以及此头文件的相应.cpp。
我的问题是:
由于
//scenario 1
//armorshop.h
#ifndef __SFML__armorshop__
#define __SFML__armorshop__
class armorshop : public entity
{
public:
};
int allocatedmemory1;
sf::FloatRect allocatedmemory2;
class armorshop allocatedmemory3;
std::vector<armorshop> allocatedmemory4;
#endif
(关于方案1的问题3澄清:)如果我多次#include "armorshop.h"
会导致错误
//scenario 2
//armorshop.cpp
int allocatedmemory1;
sf::FloatRect allocatedmemory2;
class armorshop allocatedmemory3;
std::vector<armorshop> allocatedmemory4;
答案 0 :(得分:2)
- 如何在c ++中释放已分配的内存?
醇>
如何释放内存,取决于实现,以及首先如何分配内存。
- 在每种情况下,allocatememory1,assignedmemory2,assignedmemory3或assignedmemory4都会自行释放吗?
醇>
所有这些变量都有静态存储持续时间。具有静态存储持续时间的对象在main
返回后被解除分配。
是否在包含在源文件(方案1)中的头文件中定义了全局变量,或者是否直接在源文件中定义了全局变量(方案2),这对变量何时是&#34没有区别;释放&#34;
- 变量和......在未被使用时被释放
醇>
什么都没有&#34;被释放&#34;根据它们是否被使用。
做......班级......获得自由
课程没有被释放&#34;。
如果我#include&#34; armorshop.h&#34;多次这将导致错误
armorshop.h
定义全局变量。在多个源文件中包含标头将导致每个源文件定义相同的变量。这违反了一个定义规则。你几乎不应该在标题中定义全局变量。
PS。 __SFML__armorshop__
是保留标识符,因为它包含两个连续的下划线。在代码中定义它会使您的程序格式不正确。
答案 1 :(得分:1)
这是一个由两部分组成的问题。
第一部分是,如果以这种方式在头文件中声明全局范围的对象,并且此头文件包含在多个转换单元中,则这是未定义的行为,并且通常会导致重复的符号声明错误在链接阶段。最近采用的即将到来的C++17
允许将全局范围的对象声明为inline
,允许它们按照定义的行为在多个翻译单元中声明。
对于第二部分,全局范围的对象在单个转换单元中声明,全局范围的对象在调用main()
之前的某个点构造,并且它们在某些部分被销毁或取消分配main()
返回后的一个点。未指定构造或销毁不同转换单元中的静态范围对象的相对顺序。仅指定构造或销毁同一翻译单元中的静态范围对象的相对顺序。