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

C++ destructor of a class containing a vector of pointers

本文关键字:析构函数 向量 包含 指针 C++      更新时间:2023-10-16

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

#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 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];

在析构函数中,要删除从未分配的指针。只有在new(或new[])的特定匹配用法的情况下,才能使用 delete(或 delete[]),对于 n-1 个int指针,没有这样的调用。

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

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

int *T = new int[n];

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