gpt4 book ai didi

c++ - 使用(连同)realloc 调用构造函数

转载 作者:太空宇宙 更新时间:2023-11-04 15:56:50 25 4
gpt4 key购买 nike

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

我的类模板的相关部分:

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 函数?如果没有,我如何在分配后手动调用构造函数?

最佳答案

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

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

查看 placement new 和 move 语义或查看 std::vector 的现有实现。

关于c++ - 使用(连同)realloc 调用构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55249589/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com