C++ 删除时出现分段错误[]
我一直在写一个程序来模拟一个任务的寻呼系统。该程序几乎可以运行,但由于某种原因,当我试图删除动态分配的帧数组时,我遇到了一个segfault 以下是算法代码: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
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) ;