簡體   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