gpt4 book ai didi

c++ - 解释如何正确初始化和删除指针 vector

转载 作者:行者123 更新时间:2023-11-30 01:24:33 25 4
gpt4 key购买 nike

我正在尝试为最小堆编写 C++ 代码。我想创建一个指针 vector 并确保它们被正确删除。

我能够创建一个指针 vector ,但是我从默认构造函数中收到无效转换错误。为什么会这样?

此外,我正在尝试编写一个用户定义的析构函数以确保我没有任何内存问题。但是,我不明白为什么我会收到未分配指针的错误。

#include <vector>
#include <iostream>

struct A
{
A(int av, int bv):a(av),b(bv){}
int a, b;
};

struct Heap
{
Heap() : ptr(new std::vector<A*>()) {} //WHY AM I GETTING AN ERROR FOR THE DEFAULT CONSTRUCTOR AND NOT THE CONSTRUCTOR BELOW?
//ERROR: invalid conversion from ‘std::vector<A*, std::allocator<A*> >*’ to ‘long unsigned int’
//ERROR: initializing argument 1 of ‘std::vector<_Tp, _Alloc>::vector(size_t, const _Tp&, const _Alloc&) [with _Tp = A*, _Alloc = std::allocator<A*>]’

Heap(std::vector<A*> p) : ptr(p) { //Works fine.
makeHeap();
}

~Heap(){ //I DON'T UNDERSTAND WHY I AM GETTING A MEMORY ERROR HERE
std::vector<A*>::iterator it;
for(it=ptr.begin(); it<ptr.end(); ++it)
{
delete *it;
*it=NULL;
}
}//ERROR: malloc pointer being freed was not allocated

void makeHeap()
{ //some code }

std::vector<A*> ptr;
std::vector<int> heapLoc;
};


int main()
{
A a0(2,5), a1(4,2);
std::vector<A*> aArray;
aArray.push_back(&a0);
aArray.push_back(&a1);

Heap h(aArray);

return 0;

}

最佳答案

ptr是指针 vector ,而不是指向 vector 的指针。所以你不能使用 new在堆上构造它并存储地址。

相反,像这样构造它:

Heap() : ptr() {}

这是调用 ptr 的默认构造函数,即它将创建一个空的指针 vector 。您还应该考虑更改 ptr 的名称因为它不是真正的指针。


关于你的析构函数(Dietmar 同时发布了一个答案,在他之前 Cameron 发表了评论,解释了它(+1),但为了完整起见):你遇到内存错误,因为你存储的指针在你的 vector 中引用你在堆栈上创建的对象的地址。具体来说,您在此处创建的对象:

int main()
{
A a0(2,5), a1(4,2); // <-- automatic storage, so they
// will be deallocated automatically
/* ... */
}

如果你想要你的 Heap对象负责它自己的对象,你应该让你的构造函数在堆上创建对象,然后析构函数可以删除这些对象。一种方法是定义 Heap 的复制构造函数。如下:

Heap(const std::vector<A*> &p) : ptr() {
std::vector<A*>::const_iterator it(p.begin());
for ( ; it != p.end() ; ++it)
ptr.push_back(new A(**it));
}

你的析构函数可以按原样使用,但你可能想使用 !=而不是 <在 for 循环中。

~Heap() {
std::vector<A*>::iterator it;
for(it=ptr.begin(); it != ptr.end(); ++it)
{
delete *it;
*it=NULL;
}

最后,我不确定你是否真的需要指针 vector (而不是对象 vector ),但如果你认为需要,请考虑使用智能指针(例如 C++11 提供 std::unique_ptr ,所以你可以定义 std::vector<std::unique_ptr<A>> 来解决许多与分配相关的问题)。

关于c++ - 解释如何正确初始化和删除指针 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13547299/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com