gpt4 book ai didi

c++ - 在析构函数中删除的问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:57:48 26 4
gpt4 key购买 nike

这段代码是我写的。
构造函数正常工作,但在析构函数中我得到“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;
}

最佳答案

如果要执行新的放置,则需要在原始内存上执行。像这样的东西:

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);
}

否则您将在同一个对象内存上调用 T 析构函数两次(这不是一件好事)。

此外,由于您的 p指针的类型是 T* ,您可以对其执行简单的递增/递减 - 编译器将处理 sizeof(T)作为指针运算的正常过程发出。

最后,严格来说,你应该按降序销毁数组元素(与构造相反)。

我希望这能捕获大部分或所有错误。

您可能真的想考虑使用像 std::vector 这样的东西作为存储。使用 std::vector<> 的示例紧随其后(还有一些其他语法修复)。我不确定您的类(class)是否真的需要 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() {}
};

请注意构造函数和析构函数要简单得多,因为第一个类的所有复杂性都由 std:vector 管理.

关于c++ - 在析构函数中删除的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2569234/

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