[英]C++ need clarification about destructors and scope
我有一個問題,我很確定自己知道原因。 我想澄清一下。 我有一個包含其他類的類,但是為了簡單起見,我將示例限制為兩個類。
類A包含類B。在類A的構造函數中,它通過調用B的構造函數來初始化類B。 在類A的構造函數的末尾,將調用類B的析構函數,這不是我期望的行為。 這是一個例子
啊
#include "b.h"
class a {
public:
b classB;
a(int someParam);
};
cpp文件
#include "a.h"
//Class A's constructor
a::a(int someParam) {
//Set class B by calling it's constructor
classB = b(someParam);
//Now class B's destructor gets called when exiting A's constructor...
}
我知道,如果在不使用“ new”的情況下聲明變量,則該變量在離開當前作用域時將被銷毀。 但是我一直認為這適用於變量的范圍,而不適用於為其分配值的范圍。 那是問題,對不對? 如果是這樣,那么執行classB = *new b(someParam);
並沒有錯classB = *new b(someParam);
在那兒? 還是我應該只使用指針?
在這一行:
classB = b(someParam);
表達式b(someParam)
創建一個臨時的無名b
對象,然后將該對象分配給成員對象classB
。 只是此無名臨時對象的析構函數,而不是成員對象的析構函數。 如果要避免創建此臨時對象,而是使用適當的構造函數直接初始化成員對象,請使用初始化列表:
a::a(int someParam)
:classB(someParam)
{}
和這個:
classB = *new b(someParam);
是即時內存泄漏。 您要在免費存儲區上分配一個對象,將分配給它的對象復制到classB
,並丟失指針。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.