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

时间:2017-10-09 12:29:54

标签: c++ segmentation-fault

-------我忘记添加一些东西,所以这是一个清晰的小部分-------

  1. 我添加了一个包含完整代码的hastebin
  2. 这是一项学校作业
  3. 唯一允许使用的std :: class是std :: string。没有其他外部c ++库允许(但由于某种原因允许使用c)
  4. 如果你最终读取代码,stringList应该是乐器上的字符串,而不是实际的字符串
  5. 我想创建一个模板化函数,可以快速重新分配一个传递给它的数组,无论类型如何,都是新的大小。我目前有这个代码:

    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

1 个答案:

答案 0 :(得分:0)

好吧忘了我的另一个答案。我知道你从哪里来的。

我只是拉了你的代码,终于让它运行了。对您的问题的简短回答是,majorListstringList永远不会被赋予默认值,因此为了使您的代码能够正常工作,我做了以下更改。我在相应的构造函数中给majorList和stringList一个默认值nullptr,如下所示。

即使您将变量(指针或非指针)留空以供以后使用,通常仍然明智地使用null和nullptr为该变量赋予默认值。你的代码就是一个很好的例子,Delete有一个nullptr的内置检查,但是因为你从来没有为指针分配任何值,所以当它们最后一次使用内存时剩下的随机值留有它们所以删除不能不要告诉指针是空的,并试图删除无效的指针。

majorList:

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

的StringList:

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