在多态指针数组中删除和对象

时间:2013-07-31 23:40:23

标签: c++ memory-management polymorphism

我已经实现了一个指向对象的指针向量。当我在模板中指定的数据类型不是指针时,它作为向量正常运行。我想使用它来支持一些多态对象,因此我在模板中指定的数据类型必须是指针。我陷入了一个必须delete向量中的元素的方法,我不知道如何解决这个问题。
我将尝试使用代表我所做的示例来表达我的观点:

template<typename _Tp>
class Vector{
    private:
    _Tp ** container ; 
    size_t size ;
    size_t capacity ;
    /*...*/
    public: 
    Vector() : container (NULL) { /*...*/ }
    Vector( int capacity ) { 
        container = new _Tp* [capacity] () ;
        for ( int i = 0 ; i < capacity ; i++ )  
             container[i] = NULL ; 
        size = 0 ; 
        this->capacity = capacity ;
    } 

    void deleteAt ( int position ) {
     /*... Check bad position ...*/ 
     delete ( container[position] ) ; 
     /*... move data ... */
    } 

    void assignAt ( int position, const _Tp & obj ) { 
        /*... Check bad position and capacity ...*/ 
        container[position] = new _Tp ( obj ) ; 
        size++ ;
    }
    /*... more methods ...*/ 
} ;

deleteAt(int)被调用,_Tp = SomeClass* SomeClass的析构函数永远不会被调用。我该怎么做才能解决这个问题?


这是我使用矢量的方式:

class Base () {/*... Astract class  ...*/ } ; 
class Derived1 () : public Base {/*... Implementation ...*/} ;
/*... More derived classes from Base ...*/

int main (void) {
    Vector<Base*> * v = new Vector<Base*> (100) ; 
    v->assignAt(50,new Derived1 ()) ; 
    v->deleteAt(50) ; 
}

1 个答案:

答案 0 :(得分:1)

如果您的代码存储指向对象的指针,则删除对象本身不是您(在容器中)的任务。存储指向对象的关键在于您不希望存储对象本身,而是存储指向对象的指针。如果你有一个vector<MyClass *> v;就完全一样了 - 你不希望向量中的MyClass*被破坏[或者至少,如果你想要它,你会感到失望]。

现在,如果Vector的用户希望发生这种情况,他应该在容器中存储unique_ptrshared_ptr,而不是基本指针。