[英]Freeing memory of container members
我試圖澄清我對C ++中一些內存問題的理解,主要是使用包含指針的容器。 說我有這樣的事情:
Header.H
#ifndef test_Header_h
#define test_Header_h
#include <vector>
using std::vector;
class ClassA {
int* intPtr;
public:
ClassA(int n);
~ClassA();
};
class ClassB {
vector<ClassA*> vecPtr;
public:
ClassB();
~ClassB();
void someFunc();
};
#endif
main.cpp中
#include <iostream>
#include "Header.h"
int main(int argc, const char * argv[])
{
ClassA objA(5);
ClassB objB;
return 0;
}
ClassA::ClassA(int n) {
intPtr = new int[n];
}
ClassA::~ClassA() {
delete intPtr;
}
ClassB::ClassB() {
vecPtr = vector<ClassA*>(0);
}
ClassB::~ClassB() {
//no destructor needed
}
void ClassB::someFunc() {
//vecPtr = something using new;
int* testPtr = new int[vecPtr.size()];
//do stuff
delete testPtr;
}
是否需要刪除vecPtr
? 或者ClassA
的析構函數是否為我完成了這個? 另外,如果我沒有使用vector
,如果我使用了指針list
或一pair
,那么它會是相同的情況嗎? 最后,為了澄清testPtr
需要在someFunc
刪除,因為這是它聲明的范圍,所以把它放在析構函數中是沒有意義的。 如果testPtr
共享地址重要成員的地址,刪除它也會是重要成員嗎? 我知道有很多問題,但我認為我只是在腦海中循環論證,讓自己越來越困惑。
vecPtr
不需要刪除,因為它不是指針。 對於vecPtr
的指針,這可能有所不同,取決於誰擁有這些指針的所有權。
是的,必須刪除testPtr
,它可用。 其他任何東西都不會編譯。 如果將testPtr
指向某個成員並刪除它,則在析構函數中刪除該成員時,您可能會看到雙重釋放或損壞錯誤。
通常,必須刪除的內容取決於實現。 您需要注意的唯一事情是每個新的從任何代碼路徑中的某個位置獲得一個刪除。 通常,構造函數/析構函數是一個好地方。
你這里有很大的問題。 記住這一點:
1)任何new
必須與delete
平衡。
2)任何new[]
必須與delete[]
平衡。
事實上,如果你混合它們(正如你所做的那樣),你就會有未定義的行為 。 繁榮! 你需要寫delete[] intPtr;
並delete[] testPtr;
另外,簡單地說,你沒有寫delete vecPtr
因為你沒有寫new vecPtr
。
在內部,C ++運行時會記住使用new[]
分配的元素數。 您需要使用delete[]
來允許該運行時訪問該信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.