我是否可以使用 reinterpret_cast 销毁非动态分配的对象
Can I use reinterpret_cast to destroy non dynamically allocated objects?
我已经做了一个非常简单的vector实现。我承认我作弊了很多,唯一的实例变量是例如 size_t sz
和 T * elem
.许多问题之一(但这是我所知道的唯一可能导致崩溃的问题)是pop_back()
的问题。
template <typename T>
void vec<T>::pop_back() {
if (sz == 0)
return;
elem[sz-1].~T();
--sz;
}
向量elem
是动态分配的数组,但数组中的对象可能是也可能不是。我在这里看到的问题是,如果我销毁此数组中的对象,这可能会崩溃。如果我多次破坏元素,就会发生这种情况。可以这么说,以防万一我用过pop_back。对于我的编译器来说,这似乎没有发生(这似乎很奇怪),但我听说过有人在这个函数上遇到了这个问题。我一直试图在网上做一些研究,并找到了另一种选择。这里没有完成零检查(可能是懒惰),这个例子使用的是reinterpret_cast
template<class T>
void Vector<T>::pop_back() {
// You way want to do a check for empty() before calling the destructor.
// Call the destructor.
(reinterpret_cast<T*>(buffer)[_size-1]).~T();
// It is usual to prefer the pre decrement (and pre increment).
--_size;
}
问题是,我真的可以使用reinterpret_cast来销毁向量类中的非动态分配对象吗?
编辑
根据要求,我将展示我的push_back,我不确定如何在我花在短时间内正确写作。我承认该类的主要目的不是效率,而是处理资源而不是原始动态数组的好方法(我当然可以使用向量,但这是一个比一般策略更小范围的问题,所以如果 use-std::vector 讨论被排除在外,我将不胜感激)
template <typename T>
void vec<T>::push_back(const T& obj) {
T* tmp = new T[sz+1];
if (sz > 0){
uninitialized_copy(elem, elem+sz, tmp);
delete[] elem;
}
elem = tmp;
elem[sz] = T{obj};
++sz;
}
主要问题是容量。我意识到容量部分需要大量的工作,没有它,我只能创建新元素。
这个答案的灵感来自 Herb Sutter 的 Exceptional C++(第 12 项)一书中的堆栈实现:
你可以为你的vec
分配内存,如果你初始化你的T * elem
变量
elem = static_cast<T*>(sz == 0 ? nullptr : operator new(sizeof(T)*sz));
这将为您提供尚未构造对象的内存。
编辑(感谢干杯和hth。 - Alf):您也可以通过调用 a.allocate(sz)
来使用分配器代替上面的代码。
如果要向向量添加新元素,可以使用construct
[1]。 要调用对象的析构函数,可以使用destroy
[2]。
如果你现在跟踪在变量used
的向量中分配了多少元素,你可以通过调用destroy(elem+used);
来释放最后一个元素
construct
和destroy
使用放置 new 和其中的显式析构函数调用。 我建议使用这些函数,而不是原始放置新闻和析构函数调用。
- C++ 将抽象类型的动态分配对象传递给函数并存储在向量中
- 动态分配对象中的字段-动态分配更好还是静态分配更好?C++
- 如何使用每个对象的单个构造函数参数动态分配C++对象数组?
- 将动态分配对象传递到 boost::any 构造函数中
- C 删除指向动态分配对象的指针
- 有关动态分配对象的问题
- 如何删除用于动态分配对象的智能指针
- C++函数返回指向动态分配对象的指针
- 如何创建指向动态分配对象的指针向量
- 动态分配对象数组,如 int
- 复制构造动态分配对象的问题
- 在类中动态分配对象指针的2D数组
- 在C++循环中正确删除动态分配对象的位置
- 如何获取指向动态分配对象的指针的基址
- 动态分配对象数组
- 如何删除指向动态分配对象的指针数组
- 返回对动态分配对象的引用
- 动态分配对象生成器
- 如何正确管理动态分配对象的内存
- 为什么valgrind显示泄漏,即使包含动态分配对象的向量被释放