簡體   English   中英

包含指針向量的類的C ++析構函數

[英]C++ destructor of a class containing a vector of pointers

我有一堂課,看起來像這樣:

#include <iostream>
#include <vector>
using namespace std;

class MyClass
{
    vector<int*> V;

public:
    MyClass();        
    MyClass(int n);
    ~MyClass();
};

MyClass::MyClass()
{             
    return;
}

MyClass::MyClass(int n)
{
    int* T = new int[n];
    for(int i=0; i<n; i++)
    {
        T[i]=i;
        V.push_back(&(T[i]));
    }
    return;
}

MyClass::~MyClass()
{
    for(int i =0; i<V.size(); i++)
        delete V[i];
    return;
}

int main()
{   
    MyClass C(5);
    return 0;
}
  1. 我的析構函數怎么了? 執行此操作時,出現“ *檢測到glibc * ./a.out:free():無效指針:...”錯誤。
  2. 您認為我應該使用ptr_vector嗎? 我不知道我是否有勇氣了解這些。

提前致謝!

編輯:您的意圖是要有一個指針向量,而不是數組,所以問題出在您的構造函數上:

int* T = new int[n];
for(int i=0; i<n; i++)
{
   T[i]=i;
   V.push_back(&(T[i]));
}

這不會創建n指針,而是創建一個指向n int的指針。 你應該做:

for(int i=0; i<n; i++)
{
    V.push_back(new int(i));
}

編輯之前:

問題不僅在於析構函數,還在於構造函數。

我假設您想將數組推入向量中,在這種情況下,您需要:

MyClass::MyClass(int n)
{
    int* T = new int[n];
    for(int i=0; i<n; i++)
    {
        T[i]=i;
    }
    V.push_back(T);
    return;
}

您還通過致電獲得不確定的行為

delete V[i];

代替

delete[] V[i];

在析構函數中,您將刪除從未分配的指針。 僅當有new (或new[] )的特定匹配用法時才可以使用delete (或delete[] ),並且對於n-1個int指針,沒有這樣的調用。

如果要讓向量保存指向各個不相關的int的指針,則需要使用new來分別分配每個指針。 如果它們總是要放在這樣的數組中,則在該成員中保留一個指向該數組的指針,然后在析構函數中刪除該指針。

您正在分配一個連續的內存塊

int *T = new int[n];

您不能刪除該塊的單個元素。 您一次只能刪除整個塊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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