gpt4 book ai didi

c++ - 修复了双重释放或损坏错误,但为什么会发生?

转载 作者:搜寻专家 更新时间:2023-10-31 00:28:18 26 4
gpt4 key购买 nike

<分区>

我有以下代码:

src/main.cpp :

#include <include/array.hpp>

int main() {
int temp[] = {1, 2, 3, 4, 5};
sdizo::array<int> a(temp, 5);
print_array(a);
return 0;
}

include/array.hpp

#pragma once
#include <string.h>
#include <iostream>

namespace sdizo {

template <class T>
class array {
private:
T* data;
int length;

public:
array();
array(T* d, int len);
~array();
T* begin();
T* end();
};
template <typename T>
array<T>::array() {
data = nullptr;
length = 0;
}

template <typename T>
array<T>::array(T* d, int len) {
length = len;
this->data = new T[len];
memcpy(this->data, d, sizeof(d[0]) * len);
}
template <typename T>
array<T>::~array() {
delete[] this->data;
}
template <typename T>
T* array<T>::begin() {
return &data[0];
}
template <typename T>
T* array<T>::end() {
return &data[length];
}

template <typename T>
void print_array(array<T> ar) {
for (auto x : ar) {
std::cout << x << " ";
}
std::cout << '\n';
}
}

编译它:g++ src/*.cpp -I./ -std=c++1z -g -o bin/sdizo1

现在运行它会出现以下错误:

enter image description here

我注意到当我没有打印数组时,没有发生错误。我考虑过通过引用传递数组,因为现在它会创建一个本地拷贝,并且错误可能是由两次调用析构函数引起的。所以void print_array(array<T> &ar)相反 void print_array(array<T> ar)成功了。

现在问题解决了,但这是为什么呢?我知道可能是 ~array()在同一个内存位置被调用了两次,或者类似的东西,但是为什么。 C++ 编译器不够智能,无法检测到这些事情吗?或者我应该始终通过引用传递,还是有一种方法可以通过值传递并且不会收到带有自定义析构函数的结构的此类错误?

我知道对于许多比我聪明的人来说这可能会很无聊,但是嘿,他没有质疑,没有学习。

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