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

iht*_*wot 2 c++ arrays pointers memory-management

我需要有关指针和内存管理的帮助.

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

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

thx,nmr

GMa*_*ckG 5

确保您在堆栈上推送的指针是动态分配的.以下将失败:

std::vector<Base*> objects;

void make_one(void)
{
    Derived d;

    objects.push_back(&d);
}
Run Code Online (Sandbox Code Playgroud)

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

std::vector<Base*> objects;

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

    objects.push_back(d); // a-ok
}
Run Code Online (Sandbox Code Playgroud)

只要记得在完成后通过向量,并打电话delete给他们:

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

}

std::for_each(objects.begin(), objects.end(), deleter());
Run Code Online (Sandbox Code Playgroud)

如果你可以使用boost,那么有一个指针容器库可以帮你完成.注意,你不能使用auto_ptr并尝试让它为你做; auto_ptr容器配不好用.

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

struct base
{
    virtual ~base(void) {} // important!
}
Run Code Online (Sandbox Code Playgroud)

如果不是,则调用delete基类将仅运行基础构造函数,泄漏派生类可能具有的任何资源.通过使其成为虚拟,编译器可以跳转到正确的析构函数.