Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 删除时出现分段错误[]_C++_Segmentation Fault_Destructor_Dynamic Arrays - Fatal编程技术网

C++ 删除时出现分段错误[]

C++ 删除时出现分段错误[],c++,segmentation-fault,destructor,dynamic-arrays,C++,Segmentation Fault,Destructor,Dynamic Arrays,我一直在写一个程序来模拟一个任务的寻呼系统。该程序几乎可以运行,但由于某种原因,当我试图删除动态分配的帧数组时,我遇到了一个segfault 以下是算法代码: int main(int argc, char* argv[]) { // Initialize page count PageCount = 0; // Validate input ValidateArgs(argc, argv); // Load programs and trace fr

我一直在写一个程序来模拟一个任务的寻呼系统。该程序几乎可以运行,但由于某种原因,当我试图删除动态分配的帧数组时,我遇到了一个segfault

以下是算法代码:

int main(int argc, char* argv[])
{
    // Initialize page count
    PageCount = 0;

    // Validate input
    ValidateArgs(argc, argv);

    // Load programs and trace from list file
    Programs = LoadPrograms();
    Trace = LoadTrace();

    // Load main memory
    MainMemory Memory = MainMemory(Programs);

    // Run the Algorithm
    Run(Memory);

    // Print results
    Print();

    // Print the output to a file
    PrintOutput();
    return 0;
}

void Run(MainMemory memory)
{
    int page, frame;
    vector<int> replaceFrame;

    for (long i = 0; i < Trace.size(); i++)
    {
        // Get page and frame
        page = Programs[Trace[i].ProgramNum].GetPage(Trace[i].Word);
        frame = memory.IsInMemory(page);

        if (frame != -1)
        {
            // Access page
            memory.Frames[frame].Access(i);
        }
        else
        {
            // Find page to replace
            if (Algorithm == "clock")
            {
                replaceFrame = memory.FindClock();
            }
            else if (Algorithm == "lru")
            {
                replaceFrame = memory.FindLRU(i);
            }
            else
            {
                replaceFrame = memory.FindOldest(i);
            }

            // Replace page
            memory.Frames[replaceFrame[0]].Replace(page, i);

            // Replace with next contiguous page for prepaging
            if (HowToPage)
            {
                memory.Frames[replaceFrame[1]].Replace(
                    Programs[Trace[i].ProgramNum].GetNextPage(
                        Trace[i].Word), i);
            }
        }
    }

    return;
}
但很明显,有些东西不起作用,所以我想知道我哪里搞砸了。 谢谢你的帮助

编辑:我重新检查了我的构造函数,看看它是否复制了任何东西。复制图元中的所有图元都位于与原始图元不同的位置

编辑:我被要求在这篇文章中添加一个SSCCE:

int main(int argc, char* argv[])
{
    PageCount = 0;
    Programs = LoadPrograms();
    Trace = LoadTrace();
    MainMemory Memory(Programs);

    cout << endl << "Running algorithm" << endl;
    cout << endl << "Memory is at location " << &Memory << endl;
    Test(Memory);
    return 0;
}

void Test(MainMemory memory)
{
    cout << endl << "Memory at location " << &memory << endl;
    return;
}
intmain(intargc,char*argv[])
{
页面计数=0;
程序=加载程序();
Trace=LoadTrace();
主存储器(程序);

cout我会这样做作为一个评论,但我的回答的长度排除了这一点。我可以在程序中发现一些奇怪的事情,可能与您正在得到的崩溃有关,也可能与此无关

这很糟糕:

MainMemory(const MainMemory& cpy)
{
    *this = cpy;
}
您将创建对指针的多个引用,对同一内存块进行多次删除

在这里,在为帧指定新值之前,不会删除帧

MainMemory& operator=(const MainMemory& rhs)
{
     Number = rhs.Number;
     Frames = new Frame[Number];

     for (int i = 0; i < Number; i++)
     {
         Frames[i] = Frame(rhs.Frames[i].Number,
            rhs.Frames[i].TimeStamp, rhs.Frames[i].UseCount,
            rhs.Frames[i].UseBit);
    }

    return *this;
}
然后导致您的问题(与上面的第一个问题相结合)。应该是:

MainMemory Memory (Programs) ;

我也会质疑Frames类的构造函数使用。

如果没有更多的代码,就不可能找到它失败的原因,溢出/错误发生在哪里可能是内存
的五大问题之一。我们不能说没有该类的其余代码。
Frames
是如何声明的?何时、何地、如何声明的分配它?哦,你已经读过了吗?如果你用
MainMemory=MainMemory(Programs);
替换为
MainMemory(Programs),会发生什么;
?您的代码有几个bug,但很难找到问题的直接原因。您是否尝试将其简化为?
您将创建对指针的多个引用,对同一内存块进行多次删除。
如何?
op=
执行深度复制。您的复制构造函数不执行深度复制。
MainMemory& operator=(const MainMemory& rhs)
{
     Number = rhs.Number;
     Frames = new Frame[Number];

     for (int i = 0; i < Number; i++)
     {
         Frames[i] = Frame(rhs.Frames[i].Number,
            rhs.Frames[i].TimeStamp, rhs.Frames[i].UseCount,
            rhs.Frames[i].UseBit);
    }

    return *this;
}
 MainMemory Memory = MainMemory(Programs);
MainMemory Memory (Programs) ;