包含指针向量的类的C ++析构函数

时间:2012-05-03 13:35:08

标签: c++ destructor stdvector

我有一个看起来像这样的课程:

#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吗?我不知道我是否有勇气去了解这些。
  3. 提前致谢!

3 个答案:

答案 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];

您无法删除此块的单个元素。您只能一次删除整个块。