0

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

#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 detected * ./a.out: free(): invalid pointer:...”错误。
  2. 你认为我应该使用 ptr_vector 吗?我不知道我是否有勇气去了解这些。

提前致谢!

4

3 回答 3

3

编辑:你的意图是有一个指针向量,而不是数组,所以问题出在你的构造函数上:

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

这不会创建n指针,而是指向n ints 的指针。你应该做:

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];
于 2012-05-03T13:38:00.563 回答
1

在您的析构函数中,您正在删除从未分配过的指针。如果 (or ) 有特定的匹配使用,则只能使用delete( or ),并且对于 n-1 个指针,没有这样的调用。delete[]newnew[]int

如果您希望您的向量保存指向各个不相关ints 的指针,那么您需要使用new单独分配每个。如果它们总是在这样的数组中,则在成员中保留指向该数组的指针,并在析构函数中删除该指针。

于 2012-05-03T13:37:58.690 回答
1

您正在分配一个连续的内存块

int *T = new int[n];

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

于 2012-05-03T13:39:01.483 回答