删除模板化数组时出现分段错误



-------我忘了添加一些东西,所以这是一个小部分,以便于理解-------

  1. 我添加了一个包含完整代码的hastbin
  2. 这是学校的作业
  3. 允许im使用的唯一std::class是std::string。不允许使用其他外部c++库(尽管出于某种原因,允许使用c)
  4. 如果你最终阅读了代码,stringList应该是乐器上的字符串,而不是实际的字符串

我想制作一个模板化函数,它可以快速将传递给它的数组(无论类型如何)重新分配到新的大小。我现在有这个代码:

template<class t>
t* tool_reallocateArray(t array[],int &oldSize,int newSize){
t* helper = array;
array = new t[newSize];
if(array!=0){
int toCopy=0;
if(oldSize>newSize){
toCopy = newSize;
//cout<<"new is smaller";
}else toCopy = oldSize;
for(int i=0;i<toCopy;i++){
//helper[i];
array[i] = helper[i];
}
delete[] helper; //this is where the problem is
}
oldSize = newSize;
return array;
}

如果我不删除辅助变量,这段代码就可以工作,但是,如果我不这样做,程序中仍然存在旧内存,我已经用内存验证了这一点。

然而,如果我保留这一行,我会从调试器中得到一个分段错误,并且这个错误在内存中。

Error #2: UNADDRESSABLE ACCESS: reading 0x0778fdf8-0x0778fdfc 4 byte(s)
# 0 std::__cxx11::basic_string<>::~basic_string               [../../../../../src/gcc-5.1.0/libgcc/libgcc2.c:1169]
# 1 tool_reallocateArray<>                                    [C:/Users/MoustacheSpy/Documents/Programmierung/schulprogramme/Instruments/Instrument.h:67]
# 2 Instrument::setNumberOfMajor                              [C:/Users/MoustacheSpy/Documents/Programmierung/schulprogramme/Instruments/Instrument.cpp:49]
# 3 Instrument::Instrument                                    [C:/Users/MoustacheSpy/Documents/Programmierung/schulprogramme/Instruments/Instrument.cpp:95]
# 4 StringedInstrument::StringedInstrument                    [C:/Users/MoustacheSpy/Documents/Programmierung/schulprogramme/Instruments/StringedInstrument.cpp:61]
# 5 main                                                      [C:/Users/MoustacheSpy/Documents/Programmierung/schulprogramme/Instruments/main.cpp:11]
Note: @0:00:00.562 in thread 9584
Note: instruction: mov    (%ecx) -> %eax

我不知道自己做错了什么。我唯一能做到这一点的方法就是去掉删除。

----如果有人感兴趣,这是我的完整程序代码。请随意提出一些建设性的批评,但请记住我的局限性,我在帖子的顶部发布了这些限制----https://hastebin.com/giyucukeya.cpp

好吧,忘记我的另一个答案。我明白你现在的来龙去脉了。

我刚刚提取了你的代码,终于让它运行起来了。问题的简单答案是majorListstringList从未被赋予默认值,因此为了让代码正常工作,我做了以下更改。我在各自的构造函数中给了majorList和stringList一个默认值nullptr,如下所示。

即使您将变量(指针或非指针)留空以供以后使用,通常使用null和nullptr为该变量提供默认值也是明智的。您的代码就是一个很好的例子,为什么Delete有一个内置的nullptr检查,但是因为您从未为指针分配任何值,这些指针中有上次使用内存时留下的随机值,所以Delete无法判断指针是空的,并试图删除无效指针。

主要列表:

Instrument::Instrument(const Instrument& other)
:name(other.name),majorList(nullptr)
{
this->setNumberOfMajor(other.numberOfMajor);
this->setMajorList(other.majorList);
}

Instrument::Instrument(const string& name, int numberOfMajor, string* majorList)
:name(name),numberOfMajor(0),majorList(nullptr)
{
this->setNumberOfMajor(numberOfMajor);
this->setMajorList(majorList);
}

字符串列表:

StringedInstrument::StringedInstrument(string name, int numberOfMajor, string* majorList, int numberOfStrings, char* stringList)
:Instrument(name,numberOfMajor,majorList),stringList(nullptr)
{
cout<<"Constructing stringed instrument"<<endl;
this->setNumberOfStrings(numberOfStrings);
this->setStringList(stringList);
}
StringedInstrument::StringedInstrument(const StringedInstrument &other)
:Instrument(other.getName(),other.getNumberOfMajor(),other.getMajorList()),stringList(nullptr)
{
this->setNumberOfStrings(other.numberOfStrings);
this->setStringList(other.stringList);
}

相关内容

  • 没有找到相关文章

最新更新