C++包含指针向量的类的析构函数
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;
}
- 我的析构函数有什么问题?我得到一个"* glibc 检测到 * ./a.out: free(): 无效指针:..."执行此操作时出错。
- 你认为我应该使用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];
不能删除此块的单个元素。您一次只能删除整个块。
相关文章:
- 在c++中使用向量时,如何调用构造函数和析构函数
- 向量推回调用析构函数时调用析构函数
- 在具有向量的类构造函数中进行析构函数调用
- 在VS 2017中,朋友通过具有私有析构函数的结构的unique_ptr向量进行迭代失败
- 析构函数调用c++中的一个向量
- 在不同的线程中调用向量析构函数或清除
- 如何在另一个类的向量中调用派生类的析构函数
- 仅在删除包含对象的向量时调用自定义»析构函数«
- 如何使用指针向量实现类析构函数 C++.
- C++ 带有向量、指针的析构函数
- 构造函数、析构函数和指针(以及向量、数组和删除等等)
- 是否可以在析构函数中清除向量
- 如何正确地将对象添加到向量,而无需两次调用析构函数
- 如何在不调用现有对象的析构函数的情况下在向量中添加和初始化对象
- 推入C++向量时的构造函数和析构函数调用
- C++ 删除析构函数中的向量类成员内存
- 向量:清除/pop_back不会运行析构函数
- C++包含指针向量的类的析构函数
- C++:如何结合指针为向量编写析构函数
- 在元素自己的析构函数中擦除指向静态向量中元素的指针