[英]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.