使用std :: string时访问冲突异常,其他类型都可以

时间:2017-12-04 18:10:38

标签: c++ c++11 templates unique-ptr

所以我正在编写自己的矢量类,它很顺利,但我遇到了字符串类型的问题。整个类是模板,并且与std :: vector完全相同的东西,它适用于int,double,float,char,但是当涉及到std :: string时......它没有。即使是最简单的方法也会崩溃并抛出读取访问violtion。这是一些代码

标题文件的一部分

template <class T>
class MyVector{
    std::unique_ptr<T[]> m_array;
    int m_size; 
    int m_capacity; 
};

构造

template <class T>
MyVector<T>::MyVector() : m_capacity(2), m_size(0) {
    m_array = std::make_unique<T[]>(m_capacity);
}

ExtendArray方法

template <class T>
void MyVector<T>::extendArray() {
    m_capacity *= 2;
    std::unique_ptr<T[]> temp_array = std::move(m_array);
    m_array = std::make_unique<T[]>(m_capacity);
    std::copy(temp_array.get(), temp_array.get() + m_capacity / 2, m_array.get());
}

PushBack方法

template <class T>
void MyVector<T>::pushBack(const T& p_element) {
    if (m_size == m_capacity) extendArray();
    m_array[m_size] = p_element;
    m_size++;
}

InsertAt方法,在给定索引处插入元素,然后移动数组的其余部分

template <class T>
void MyVector<T>::insertAt(int index, const T& p_element) { 
        if (m_size >= m_capacity - 1) extendArray();            
        if (m_array[index] == T{}) {
            m_array[index] = p_element;
            m_size++;
        }
        else {
            std::copy(m_array.get() + index, m_array.get() + m_capacity, m_array.get() + index + 1);
            m_array[index] = p_element;
            m_size++;
        }
}   

问题1 PushBack方法工作正常,我不断添加所有类型的元素(包括字符串),它的确定。当我尝试使用insertAt方法

时会出现问题
int main() {    
    MyVector<std::string> vec;
    vec.pushBack("Ok here");
    vec.pushBack("Extending array now");
    vec.pushBack("Still no errors");
    vec.insertAt(1, "Here comes the exception");
    std::cin.get();
}

我得到了

  

MySTL.exe中的0x589750B9(vcruntime140d.dll)抛出异常:   0xC0000005:访问冲突写入位置0xB9B431B6。

如果我对char,int,float,double做同样的事情,一切正常。

问题2 我在Ubuntu上开始这个项目,用G ++编译它,我没有模板问题,现在我在Windows上工作,使用VS 2017社区,我需要添加

template class MyVector<std::string>;
template class MyVector<int>;
template class MyVector<float>;
我的.cpp中的

等为了编译它,如果类型没有这样定义,它只是不编译...任何其他更好的解决方案?

问题3 在G ++上,我在向量中添加其他类没有任何问题,现在我无法做到这一点。即使我在.cpp中声明简单的类,例如

class Test {
    int m_x;
public:
    Test() {}
    Test(int p_x) : m_x(p_x) {}
    int getX() { return m_x; };
};

template class MyVector <Test>;

它不起作用,我得到了很多这样的编译器错误

  

错误C2676:二进制'==':'测试'没有定义此运算符或转换为预定义运算符可接受的类型

指向

if (m_array[index] == T{}) 

在G ++上,NULL或T {}都有效,现在它们都不起作用。

0 个答案:

没有答案