在自定义std :: vector类容器中处理指针和非指针模板类型的最佳方法是什么?

问题描述 投票:0回答:1

因此,我正在构建自己的类似于std :: vector的动态数组容器以进行娱乐/研究。我的容器的标头如下所示:

template<class ElementClass> 
class Array
{
public:
    Array(class Allocator* allocator, size_t initialCapacity);
    ~Array();

    ...

private:
    class Allocator* allocator;
    ElementClass* pFirst;
    size_t m_capacity;
    size_t m_size;
};

到目前为止,我的Array类与我提供给模板的任何类型都可以正常工作(woohoo!)。但是,当我尝试使用指针而不是对象类型时,当前的实现似乎很困难。析构函数就是一个很好的例子:

template<class ElementClass>
Array<ElementClass>::~Array()
{
    for (size_t c = 0; c < m_capacity; c++)
    {
        pFirst[c]->~ElementClass();
    }
    allocator->free(pFirst);
}

[这显然会导致令人讨厌的错误,因为例如,如果我要创建一个Array<int*>,则ElementClass会转换为int*,编译器正确地跳闸并继续掉下一段长长的台阶。另外,在其他地方也会发生这种情况,但为了简洁起见,我将其省略。

因此,我的问题是:处理此模板类的正确方法是什么,以便它允许我创建一个可以处理指针以及非指针类型的模板容器?我是否应该对出现此类问题的功能使用某种模板专门化技术?提前致谢。 :)

c++ templates memory memory-management stl
1个回答
0
投票

您似乎正在做的是在指针所指向的元素上调用dtor,而不是在数组中存储的指针值。如果您的阵列在dtor中除了执行其他操作,那是错误的...。

template<class ElementClass>
Array<ElementClass>::~Array()
{
    for (size_t c = 0; c < m_size; c++)
    {
        pFirst[c].~ElementClass();
    }
    allocator->free(pFirst);
}

对数组中的指针所指向的对象调用dtor对我来说非常危险。谁知道这些指针的来源(NULL,堆栈分配的变量等)。

数组是“错误C2325:'int *':'->〜'右边的意外类型:预期的'int'”。

ElementClass的类型为int*

。您正在尝试取消引用该指针,因此现在的类型为int。然后,您尝试在int*上调用类型为[int的dtor。
© www.soinside.com 2019 - 2024. All rights reserved.