首页 > 解决方案 > 使用(连同)realloc 调用构造函数

问题描述

我正在使用类模板为家庭作业编写自己的 std::vector 类型。我不希望它尽可能高效,所以我更喜欢使用 realloc 函数而不是新函数。这给我带来了一个问题,因为当我为新成员分配内存时,它不会调用新成员的构造函数,这会导致很多问题。

我的课程模板的相关部分:

template<class T>
class myVec {
    T *m_data;
    unsigned m_size;
public:
    //some methods
    //some methods
    myVec<T>& resize(unsigned size) {
        if (size == 0)
        {
            delete[] m_data;
            m_data = nullptr;
            m_size = 0;
            return *this;
        }
        m_data = (T*)realloc(m_data, size * sizeof(T));  //should call to constructor of T here!
        m_size = size;
        return *this;
    };
    void push(const T& t) {
        m_data = (T*)realloc(m_data, ++m_size * sizeof(T));
        memcpy(m_data, &t, sizeof(t));
        //m_data[m_size - 1] = t;
    };
    ~myVec() { delete[] m_data; };
};

使用 realloc(来自 C,如 malloc 和 free)以及 new 和 delete 是否错误?如果是这样,是否有类似 c++ 的 realloc 函数调用构造函数?如果没有,我如何在分配后手动调用构造函数?

标签: c++templatesmemory-managementconstructor

解决方案


是的,realloc以这种方式使用从根本上来说是不可挽回的错误。

例如,考虑一个有两个成员的类,其中一个是指向另一个的指针。如果您realloc是该类的实例,则指针将不再指向另一个成员,从而破坏了它。

查看放置 new 和 move 语义或查看std::vector.


推荐阅读