gpt4 book ai didi

c++ - 在析构函数 : Invalid address specified to RtlValidateHeap 中使用 delete[]

转载 作者:行者123 更新时间:2023-11-28 05:11:55 27 4
gpt4 key购买 nike

我正在编写一个数组类模板,但在使用析构函数时遇到了问题。

#ifndef ARRAY_CPP
#define ARRAY_CPP
using namespace std;
#include<iostream>
#include<sstream>
#include "Array.h"


//Define default constructor, initialize an array of size 10 with all elements being (0,0)
template<typename T> //Define type parameter
Array<T>::Array() {
size = 10;
m_data = new T[size];
}


template<typename T> //Define type parameter
Array<T>::Array(int si) {
size = si;
m_data = new T[size];
}

template<typename T> //Define type parameter
Array<T>::Array(const Array<T>& source) {
size = source.size; //Set the size equal to the size of the source
m_data = new T[size]; //Create a new source on the heap
//Loop through and copy each member of the source array to the new array
for (int i = 0; i < size; i++) {
m_data [i] = source.m_data [i];
}
}

//Define default destructor
template<typename T> //Define type parameter
Array<T>::~Array() {
delete[] m_data;
}

//Define operator =
template<typename T> //Define type parameter
Array<T>& Array<T>::operator = (const Array<T>& source) {
//Check self-assignment
if (this != &source) {
//Delete the old array
delete[] m_data;
size = source.size; //Set the size equal to the size of the source
m_data = source.m_data; //Set the dynamic C array equal to that of the source
//Loop through each element and copy each member of the source array to the current array
for (int i = 0; i < size; i++) {
m_data[i] = source.m_data [i];

}
}
//Return current array
return *this;

}
//Define operator[]
template<typename T> //Define type parameter
T& Array<T>::operator[](int index) {
if ((index < 0) || (index>= size))
throw -1;
return m_data[index];
}

//Define constant operator[]
template<typename T> //Define type parameter
const T& Array<T>::operator [] (int index) const {
if ((index < 0) || (index >= size))
throw -1;
return m_data[index];
}

using namespace std;
#include<iostream>
#include<sstream>
#include "Array.cpp"


void main() {

Array<double> test(10);
Array<double> test2(10);
test2 = test;
}

每当在 main 中调用数组的析构函数时,它都会给我错误:指定给 RtlValidateHeap 的地址无效。我知道这是因为我试图删除堆栈上的内存。但是,在我的构造函数中,我使用 new 初始化数组,这应该在堆上创建内存......代码在我实现模板之前运行良好。非常感谢!

最佳答案

我可以看到一个错误和一个潜在错误:

错误:在赋值运算符中。您复制了指针

template<typename T>
Array<T>& Array<T>::operator = (const Array<T>& source) {
// STUFF

// This is a problem
m_data = source.m_data;

// MORE STUFF
}
return *this;

}

您现在有两个对象指向同一 block 动态分配的内存。这是一个问题,因为当它们超出范围时,两个对象中的析构函数将尝试在同一指针 value 上调用 delete。

潜在错误:我没有看到复制构造函数。如果您没有定义(或没有明确删除它),那么编译器将为您生成它。默认情况下不适用于自有资源(即动态分配的内存),因为它对资源进行浅拷贝。

编译器生成的如下所示:

template<typename T>
Array<T>& Array<T>::Array(const Array<T>& source)
: size(source.size)
, m_data(source.m_data)
{}

您可以看到这与您的赋值运算符存在相同的问题。它只是复制指针。导致两个对象指向同一动态分配内存的相同问题。

关于c++ - 在析构函数 : Invalid address specified to RtlValidateHeap 中使用 delete[],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43332052/

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