如何在C ++中释放分配的内存?

时间:2016-06-26 22:24:37

标签: c++ memory memory-management sfml

假设我有一个包含类定义的头文件armorshop.h,以及此头文件的相应.cpp。

我的问题是:

  1. 如何在c ++中释放已分配的内存?
  2. 在每种情况下,allocatememory1,assignedmemory2,assignedmemory3或assignedmemory4都会自行释放吗?
  3. 这些上述分配的内存是否会被重新定义并导致每种情况出错?
  4. 在类定义中定义的变量和类等是否在未被使用时被释放,并在重新使用时重新定义?或者它们是否被定义一次并在不使用时耗尽资源?
  5. 由于

    //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;
    

2 个答案:

答案 0 :(得分:2)

  
      
  1. 如何在c ++中释放已分配的内存?
  2.   

如何释放内存,取决于实现,以及首先如何分配内存。

  
      
  1. 在每种情况下,allocatememory1,assignedmemory2,assignedmemory3或assignedmemory4都会自行释放吗?
  2.   

所有这些变量都有静态存储持续时间。具有静态存储持续时间的对象在main返回后被解除分配。

是否在包含在源文件(方案1)中的头文件中定义了全局变量,或者是否直接在源文件中定义了全局变量(方案2),这对变量何时是&#34没有区别;释放&#34;

  
      
  1. 变量和......在未被使用时被释放
  2.   

什么都没有&#34;被释放&#34;根据它们是否被使用。

  

做......班级......获得自由

课程没有被释放&#34;。

  

如果我#include&#34; armorshop.h&#34;多次这将导致错误

armorshop.h定义全局变量。在多个源文件中包含标头将导致每个源文件定义相同的变量。这违反了一个定义规则。你几乎不应该在标题中定义全局变量。

PS。 __SFML__armorshop__是保留标识符,因为它包含两个连续的下划线。在代码中定义它会使您的程序格式不正确。

答案 1 :(得分:1)

这是一个由两部分组成的问题。

第一部分是,如果以这种方式在头文件中声明全局范围的对象,并且此头文件包含在多个转换单元中,则这是未定义的行为,并且通常会导致重复的符号声明错误在链接阶段。最近采用的即将到来的C++17允许将全局范围的对象声明为inline,允许它们按照定义的行为在多个翻译单元中声明。

对于第二部分,全局范围的对象在单个转换单元中声明,全局范围的对象在调用main()之前的某个点构造,并且它们在某些部分被销毁或取消分配main()返回后的一个点。未指定构造或销毁不同转换单元中的静态范围对象的相对顺序。仅指定构造或销毁同一翻译单元中的静态范围对象的相对顺序。