gpt4 book ai didi

C++,不能使用数组或 vector ,我如何使用指针来解决这个问题?

转载 作者:搜寻专家 更新时间:2023-10-31 00:23:34 25 4
gpt4 key购买 nike

我需要指针和内存管理方面的帮助。

我需要存储不同的对象,所有这些对象都派生自同一个基类,并且一直在使用数组来执行此操作,但是当数组中填充了不同的对象时,它会导致段错误。

当数组中充满了相同派生类型的对象时,我的程序运行良好。当数组填充了不同的对象时,它按预期通过存储在第一个位置的对象工作,但是当它切换到输出第二个对象时,它给了我段错误。我知道这是一个内存访问问题,但我不清楚我应该如何管理取决于用户输入的可变数量的对象。

谢谢,核磁共振

最佳答案

确保您压入堆栈的指针是动态分配的。以下将失败:

std::vector<Base*> objects;

void make_one(void)
{
Derived d;

objects.push_back(&d);
}

因为当函数结束时,&d 指向的类将被释放。这可以通过动态分配对象来缓解:

std::vector<Base*> objects;

void make_one(void)
{
Derived *d = new Derived;

objects.push_back(d); // a-ok
}

请记住在完成后遍历 vector ,并对它们调用 delete:

struct deleter
{
template <typename T>
void operator()(T* pObject) const
{
delete pObject;
}

}

std::for_each(objects.begin(), objects.end(), deleter());

如果可以使用boost,就有一个pointer container library那会为你做这件事。请注意,您不能使用 auto_ptr 并尝试让它为您完成; auto_ptr 不能很好地处理容器。

此外,请确保您的基类具有虚拟析构函数:

struct base
{
virtual ~base(void) {} // important!
}

如果不是,则在基类上调用delete 将只运行基类构造函数,泄漏派生类可能拥有的任何资源。通过将其设为虚拟,编译器可以跳转到正确的析构函数。

关于C++,不能使用数组或 vector ,我如何使用指针来解决这个问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1761047/

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