我有一个看起来像这样的课程:
#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;
}
提前致谢!
答案 0 :(得分:3)
编辑:你的意图是有一个指针向量,而不是数组,所以问题在于你的构造函数:
int* T = new int[n];
for(int i=0; i<n; i++)
{
T[i]=i;
V.push_back(&(T[i]));
}
这不会创建n
指针,而是指向n
int
s的指针。
你应该这样做:
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];
答案 1 :(得分:1)
在析构函数中,您将删除从未分配的指针。如果delete
(或delete[]
)的特定匹配使用,以及new
的n-1,则只能使用new[]
(或int
)指针,没有这样的电话。
如果您希望向量保存指向各个不相关int
的指针,则需要使用new
分别分配每个向量。如果它们总是在这样的数组中,那么在成员中保留一个指向该数组的指针,并在析构函数中只删除那个指针。
答案 2 :(得分:1)
您正在使用
分配连续的内存块int *T = new int[n];
您无法删除此块的单个元素。您只能一次删除整个块。