如何在 C++ 中释放已分配的内存?
How Does Allocated Memory Get Freed In C++?
假设我有一个头文件 armorshop.h,其中包含一个 class 定义,以及该头文件的相应 .cpp。
我的问题是:
- 如何在 C++ 中释放分配的内存?
- allocatedmemory1、allocatedmemory2、allocatedmemory3 或 allocatedmemory4 是否会在每种情况下自行释放?
- 这些上述分配的内存是否会被重新定义并在每种情况下导致错误?
- 在 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 之后的某个时间点。未指定构建或销毁不同翻译单元中的静态范围对象的相对顺序。仅指定构建或销毁同一翻译单元中的静态作用域对象的相对顺序。
- How does allocated memory get freed in c++?
如何 释放内存,取决于实现,以及内存最初是如何分配的。
- Will allocatedmemory1, allocatedmemory2, allocatedmemory3, or allocatedmemory4 ever be freed on its own in each of these scenarios?
所有这些变量都具有静态存储持续时间。 Objects 静态存储持续时间在 main
返回后被释放。
全局变量是在包含在源文件中的 header 文件中定义的(场景 1),还是全局变量是直接在源文件中定义的(场景 2),对何时定义没有区别变量是 "freed".
- 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.
假设我有一个头文件 armorshop.h,其中包含一个 class 定义,以及该头文件的相应 .cpp。
我的问题是:
- 如何在 C++ 中释放分配的内存?
- allocatedmemory1、allocatedmemory2、allocatedmemory3 或 allocatedmemory4 是否会在每种情况下自行释放?
- 这些上述分配的内存是否会被重新定义并在每种情况下导致错误?
- 在 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 之后的某个时间点。未指定构建或销毁不同翻译单元中的静态范围对象的相对顺序。仅指定构建或销毁同一翻译单元中的静态作用域对象的相对顺序。
- How does allocated memory get freed in c++?
如何 释放内存,取决于实现,以及内存最初是如何分配的。
- Will allocatedmemory1, allocatedmemory2, allocatedmemory3, or allocatedmemory4 ever be freed on its own in each of these scenarios?
所有这些变量都具有静态存储持续时间。 Objects 静态存储持续时间在 main
返回后被释放。
全局变量是在包含在源文件中的 header 文件中定义的(场景 1),还是全局变量是直接在源文件中定义的(场景 2),对何时定义没有区别变量是 "freed".
- 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.