簡體   English   中英

釋放容器成員的記憶

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM