我写了这段代码.
构造函数正常工作,但在析构函数中,我得到"Windows触发了一个断点".我该怎么纠正这个?
template class CyclicalArray {
private:
T* mem_ptr;
public:
CyclicalArray(size_t capacity, const T& default_value) {
this->default_value = default_value;
this->capacity = capacity;
head_index = 0;
mem_ptr = ::new T[capacity]; //memory allocating
for(T* p = mem_ptr; p < mem_ptr + capacity * sizeof(T); p += sizeof(T)) {
::new (p) T (default_value); //initialization
}
}
~CyclicalArray() {
for(T* p = mem_ptr + sizeof(T); p < mem_ptr + capacity * sizeof(T); p += sizeof(T)) {
p->~T();
}
delete[] mem_ptr;
}
Run Code Online (Sandbox Code Playgroud)
如果您要执行新的放置,则需要在原始内存上执行此操作.就像是:
template class CyclicalArray {
private:
T* mem_ptr;
public:
CyclicalArray(size_t capacity, const T& default_value) {
this->default_value = default_value;
this->capacity = capacity;
head_index = 0;
mem_ptr = reinterpret_cast<T*>( ::new char[capacity * sizeof(T)]); //memory allocating
for(T* p = mem_ptr; p < mem_ptr + capacity; ++p) {
::new (p) T (default_value); //initialization
}
}
~CyclicalArray() {
// this
for(T* p = mem_ptr + capacity; p != mem_ptr; --p) {
(p-1)->~T();
}
delete[] reinterpret_cast<char*>( mem_ptr);
}
Run Code Online (Sandbox Code Playgroud)
否则你将在相同的对象内存上调用两次T析构函数(这不是一件好事).
此外,由于您的p指针是类型T*,您可以对其执行简单的递增/递减 - 编译器将处理该sizeof(T)问题作为指针算法的正常过程.
最后,严格来说,你应该按降序销毁数组元素(与构造相反).
我希望这可以捕获大部分或全部错误.
您可能真的想考虑使用std :: vector之类的东西作为商店.使用std::vector<>以下示例(使用一些其他语法修复).我不确定你的班级是否真的需要副本default_value或head_index- 我让他们假设你打算在其他方法中使用它们:
#include <vector>
template <typename T>
class CyclicalArray {
private:
std::vector<T> backing_store;
T default_value;
size_t head_index;
public:
CyclicalArray(size_t capacity, const T& def_val) :
backing_store(capacity, def_val),
default_value( def_val),
head_index(0) {
}
~CyclicalArray() {}
};
Run Code Online (Sandbox Code Playgroud)
注意构造函数和析构函数有多简单,因为第一个类的所有复杂性都由它来管理std:vector.
你可能会超越mem_ptr阵列的末尾.在C和C++中,指针算法以所涉及的类型为单位,而不是字节.举例来说,如果你有int *a;,那么如果a是0x100的,而且sizeof(int) == 4,a + 1是量0x104.
因此,你p按类型平方的大小递增,因为向它添加1将移动它的sizeof(T)字节,因此添加sizeof(T)它会使它增加太多.
更不用说你不需要在数组中调用各个析构函数,因为delete []它会为你处理.
| 归档时间: |
|
| 查看次数: |
371 次 |
| 最近记录: |