繁体   English   中英

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

[英]How Does Allocated Memory Get Freed In C++?

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

我的问题是:

  1. 如何在C ++中释放分配的内存?
  2. 在每种情况下,是否都会自行释放allocatedmemory1,allocatedmemory2,allocatedmemory3或allocatedmemory4?
  3. 这些前述分配的内存是否会在每种情况下重新定义并导致错误?
  4. 不使用类定义中定义的变量和类等时,是否可以释放它们,而在再次使用它们时是否可以重新定义它们? 还是只是一次定义它们并在不使用时消耗资源?

谢谢

//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;
  1. 如何在C ++中释放分配的内存?

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

  1. 在每种情况下,是否都会自行释放allocatedmemory1,allocatedmemory2,allocatedmemory3或allocatedmemory4?

所有这些变量都具有静态存储持续时间。 main返回之后,将释放具有静态存储持续时间的对象。

全局变量是在源文件中包含的头文件中定义的(方案1),还是全局变量是在源文件中直接定义的(方案2),与变量“释放”的时间没有区别。

  1. 在不使用变量和...时将其释放

不管是否使用,都不会“释放”任何内容。

做...课...得到释放

类不是“释放”的。

如果多次#include“ armorshop.h”,将导致错误

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

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

这是一个分为两个部分的问题。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM