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

How Does Allocated Memory Get Freed In C++?

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

我的问题是:

  1. 如何在 C++ 中释放分配的内存?
  2. allocatedmemory1、allocatedmemory2、allocatedmemory3 或 allocatedmemory4 是否会在每种情况下自行释放?
  3. 这些上述分配的内存是否会被重新定义并在每种情况下导致错误?
  4. 在 class 定义的 内部 中定义的变量和 class 等是否在不使用时释放,并在使用时重新定义又用了?还是它们被定义一次并在不使用时耗尽资源?

谢谢

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

(问题 3 关于场景 1 的说明:)如果我 #include "armorshop.h" 多次,这会导致错误吗

//scenario 2
//armorshop.cpp
int allocatedmemory1;
sf::FloatRect allocatedmemory2;
class armorshop allocatedmemory3;
std::vector<armorshop> allocatedmemory4;

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

第一部分是,如果全局范围的对象以这种方式在头文件中声明,并且该头文件从多个翻译单元中包含,这是未定义的行为,通常会导致重复的符号link 阶段的声明错误。最近对即将推出的 C++17 进行了补充,允许将全局范围的对象声明为 inline,允许它们在多个翻译单元中声明,作为定义的行为。

对于第二部分,全局范围的对象在单个翻译单元中声明,全局范围的对象在调用 main() 之前的某个时间点构建,然后被销毁或释放,在 main() returns 之后的某个时间点。未指定构建或销毁不同翻译单元中的静态范围对象的相对顺序。仅指定构建或销毁同一翻译单元中的静态作用域对象的相对顺序。

  1. How does allocated memory get freed in c++?

如何 释放内存,取决于实现,以及内存最初是如何分配的。

  1. Will allocatedmemory1, allocatedmemory2, allocatedmemory3, or allocatedmemory4 ever be freed on its own in each of these scenarios?

所有这些变量都具有静态存储持续时间。 Objects 静态存储持续时间在 main 返回后被释放。

全局变量是在包含在源文件中的 header 文件中定义的(场景 1),还是全局变量是直接在源文件中定义的(场景 2),对何时定义没有区别变量是 "freed".

  1. Do variables and ... get freed when they are not being used

没有什么是 "freed" 取决于它们是否被使用。

Do ... classes ... get freed

类 不是 "freed".

If I #include "armorshop.h" multiple times will this cause an error

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

中定义全局变量

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