析构函数中删除的问题

Ver*_*era 4 c++

我写了这段代码.
构造函数正常工作,但在析构函数中,我得到"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)

Mic*_*urr 8

如果您要执行新的放置,则需要在原始内存上执行此操作.就像是:

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_valuehead_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.


Dav*_*ley 7

你可能会超越mem_ptr阵列的末尾.在C和C++中,指针算法以所涉及的类型为单位,而不是字节.举例来说,如果你有int *a;,那么如果a是0x100的,而且sizeof(int) == 4,a + 1是量0x104.

因此,你p按类型平方的大小递增,因为向它添加1将移动它的sizeof(T)字节,因此添加sizeof(T)它会使它增加太多.

更不用说你不需要在数组中调用各个析构函数,因为delete []它会为你处理.