[英]How Does Allocated Memory Get Freed In C++?
假设我有一个头文件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;
- 如何在C ++中释放分配的内存?
如何释放内存,取决于实现方式以及首先分配内存的方式。
- 在每种情况下,是否都会自行释放allocatedmemory1,allocatedmemory2,allocatedmemory3或allocatedmemory4?
所有这些变量都具有静态存储持续时间。 在main
返回之后,将释放具有静态存储持续时间的对象。
全局变量是在源文件中包含的头文件中定义的(方案1),还是全局变量是在源文件中直接定义的(方案2),与变量“释放”的时间没有区别。
- 在不使用变量和...时将其释放
不管是否使用,都不会“释放”任何内容。
做...课...得到释放
类不是“释放”的。
如果多次#include“ armorshop.h”,将导致错误
armorshop.h
定义全局变量。 在多个源文件中包含标头将导致每个源文件定义相同的变量。 这违反了一个定义规则。 您几乎不应在标头中定义全局变量。
PS。 __SFML__armorshop__
是保留标识符,因为它包含两个连续的下划线。 在代码中定义它会使您的程序格式错误。
这是一个分为两个部分的问题。
第一部分是,如果以这种方式在头文件中声明了全局范围的对象,并且该头文件从多个转换单元中包含在内,则这是未定义的行为,通常会在链接期间导致重复的符号声明错误相。 对即将到来的C++17
的最新采用允许将全局范围内的对象声明为inline
,从而允许它们以定义的行为在多个转换单元中声明。
对于第二部分,全局范围内的对象在单个转换单元中声明,全局范围内的对象在main()
调用之前的某个点被构造,它们在main()
之后的某个点被破坏或释放。返回。 未指定在不同翻译单元中构造或破坏静态作用域对象的相对顺序。 仅指定构造或销毁同一转换单元中静态作用域对象的相对顺序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.