[英]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;
}
提前致謝!
編輯:您的意圖是要有一個指針向量,而不是數組,所以問題出在您的構造函數上:
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.